|
автор: Katreen (12.11.2005 в 20:49) |
|
| Мне нужно перенаправлять все на index.php, если в строке запроса не содержится точка. Пишу в htaccess:
RewriteEngine on
RewriteBase /
RewriteRule ^([^.]+)$ index.php
Вроде и перенаправляет, но например в случае такого запроса
http://irish.ru/admin/razdely/2 ,
когда надо перенаправить на index.php (поскольку запрос не содержит точку), на самом деле идет перенаправление на http://irish.ru/admin/razdely.php (в директории admin лежит файл razdely.php), то есть попутно как бы идет проверка на имя файла и требуемого перенаправления на index.php не происходит...
Как решить эту проблему? | |
|
|
|
|
|
|
|
для: Katreen
(12.11.2005 в 20:49)
| | Не срабатывает в случае, когда URL частично совпадает с именем существующего файла?
Попробуйте запретить Apache-у умничать с подстановкой похожих URL-ов.
| |
|
|
|
|
автор: Katreen (13.11.2005 в 10:01) |
|
|
для: glsv (Дизайнер)
(12.11.2005 в 22:26)
| | Да, спасибо, так получилось. Но на хостинге Options запрещено. Что делать??? | |
|
|
|
|
|
|
|
для: Katreen
(13.11.2005 в 10:01)
| | На сколько я помню из своих экспериментов подстановка URL, осуществляемая multiviews, происходит до того, как запрос поступает на обработку модулем mod_rewrite. Т.е. mod_rewrite здесь бессилен.
Как организационный вариант решения проблемы: избавится от файлов (переименовать), имена которых фигурируют в URL-ах. | |
|
|
|
|
|
|
|
для: Katreen
(12.11.2005 в 20:49)
| | Посоветуйте с таким вопросом. Нужно, чтобы на сайте производился поиск больше, чем в одном каталоге. Именно, нужно, что при запросе music/filename.ext производился поиск в каталогах music/mp3/ и music/text/, т.е. файл filename.ext может находиться в одном из них.
В руководстве по mod_rewrite http://www.egoroff.spb.ru/portfolio/apache/rewriteguide.html даётся такой вариант решения:
RewriteEngine on
# во-первых попытаемся найти это в указанном месте/...
# ...и если нашли то заканчиваем поиск и сидим и радуемся:
RewriteCond /your/docroot/dir1/%{REQUEST_FILENAME} -f
RewriteRule ^(.+) /your/docroot/dir1/$1 [L]
# во-вторых - попытаемся найти это в pub/...
# ...и если нашли то заканчиваем поиск и сидим и радуемся:
RewriteCond /your/docroot/dir2/%{REQUEST_FILENAME} -f
RewriteRule ^(.+) /your/docroot/dir2/$1 [L]
# иначе продолжаем для других директив Alias или ScriptAlias,
# и т.д.
RewriteRule ^(.+) - [PT]
|
Мне непонятно, если REQUEST_FILENAME даёт [F], то зачем в RewrireRule подставлять тот же самый каталог /your/docroot/dir2/? | |
|
|
|
|
|
|
|
для: Alex14
(17.11.2005 в 14:04)
| | >Мне непонятно, если REQUEST_FILENAME даёт [F], то зачем в RewrireRule подставлять тот же самый каталог /your/docroot/dir2/?
Что значит дает [F]?
RewriteCond /your/docroot/dir1/%{REQUEST_FILENAME} -f
RewriteRule ^(.+) /your/docroot/dir1/$1 [L]
|
Условие RewriteCond проверяет существует ли REQUEST_FILENAME в директории dir1.
Если существует (истина), то выполняется RewriteRule. Если нет (ложь), то перепрыгиваем на следующую строку.
Условный параметр -f как раз и дает указание RewriteCond выполнить проверку существования файла, определяемого контрольной строкой /your/docroot/dir1/%{REQUEST_FILENAME}.
А вот, например, параметр -d осуществляет проверку существования каталога.
А -s проверяет: не является ли запрошенный файл пустым | |
|
|
|
|
|
|
|
для: glsv (Дизайнер)
(20.11.2005 в 23:21)
| | Ясно, спасибо за ответ. Видимо невнимательно читал инструкцию по mod_rewrite про опции.
Ещё есть такой вопрос. Нужно осуществить преобразование адресов типа:
http://site.ru/main/begin.html ---> http://site.ru/index.php?dir=main&p=begin
|
Пишу так:
RewriteRule ^([^/]+)/([^/]+)\.html index.php?dir=$1&p=$2
|
Всё работает, файл index.php открывает нужный файл /dir/p.html, содержащий контент, и генерирует html-страницу в нужном дизайне. При создании этой страницы используются стилевой файл и картинки, пути к которым прописаны в index.php. Но почему то в html-коде результирующего файла (например, /main/begin.html) эти пути оказываются неправильными и поэтому стилевой файл и картинки не загружаются. Т.е. вместо изначально прописанного /img/logo.gif, путь становится /main/img/logo.gif. Как будто файл index.php выполняется в каталоге /main/ (из которого читается контент), а не в корневом каталоге, в котором он в действительности и находится. Эта проблема устраняется введением в index.php тега <base>, но где то читал, что поисковые системы не любят этот тег. | |
|
|
|
|
|
|
|
для: Alex14
(23.11.2005 в 13:48)
| | >Но почему то в html-коде результирующего файла (например, /main/begin.html) эти пути оказываются неправильными
Потому что запрос на получение картинок не совпадает с шаблоном в RewriteRule.
Т.е. запрашиваемый /img/logo.gif никак не подпадает под Ваше правило.
RewriteRule ^([^/]+)/([^/]+)\.html index.php?dir=$1&p=$2
|
А любая картинка, любой css файл запрашивается точно также, как и сама страница. Только этого не видно в адресной строке.
Создайте специальные правила для картинок и стилей. Чтобы отличить картинки и стили от php и html страниц можно привязаться к именам директорий, где хранятся картинки и стили. | |
|
|
|