Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Apache

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Помогите с mod_rewrite, please
 
 автор: 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 не происходит...
Как решить эту проблему?

   
 
 автор: glsv (Дизайнер)   (12.11.2005 в 22:26)   письмо автору
 
   для: Katreen   (12.11.2005 в 20:49)
 

Не срабатывает в случае, когда URL частично совпадает с именем существующего файла?
Попробуйте запретить Apache-у умничать с подстановкой похожих URL-ов.

Options -MultiViews

   
 
 автор: Katreen   (13.11.2005 в 10:01)
 
   для: glsv (Дизайнер)   (12.11.2005 в 22:26)
 

Да, спасибо, так получилось. Но на хостинге Options запрещено. Что делать???

   
 
 автор: glsv (Дизайнер)   (13.11.2005 в 19:17)   письмо автору
 
   для: Katreen   (13.11.2005 в 10:01)
 

На сколько я помню из своих экспериментов подстановка URL, осуществляемая multiviews, происходит до того, как запрос поступает на обработку модулем mod_rewrite. Т.е. mod_rewrite здесь бессилен.
Как организационный вариант решения проблемы: избавится от файлов (переименовать), имена которых фигурируют в URL-ах.

   
 
 автор: Alex14   (17.11.2005 в 14:04)   письмо автору
 
   для: 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/?

   
 
 автор: glsv (Дизайнер)   (20.11.2005 в 23:21)   письмо автору
 
   для: 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 проверяет: не является ли запрошенный файл пустым

   
 
 автор: Alex14   (23.11.2005 в 13:48)   письмо автору
 
   для: 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>, но где то читал, что поисковые системы не любят этот тег.

   
 
 автор: glsv (Дизайнер)   (24.11.2005 в 00:09)   письмо автору
 
   для: 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 страниц можно привязаться к именам директорий, где хранятся картинки и стили.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования