Архив рубрики ‘apache’

Про mod_rewrite, снова

в руководстве по apache видимо не зря пишут, что mod_rewrite — это сплошное шаманство…

искал сегодня весь вечер решение такой задачи:
пусть у нас есть на web-сервере странички
http://serv.qu/page1.html
http://serv.qu/page2.html
и т.д.
нужно, чтобы их содержимое было доступно по адресам
http://serv.qu/page1
http://serv.qu/page1/
с первым адресом все относительно просто, а вот со вторым, из-за слэша в конце, засада… В результате плясок с бубном выкристаллизовалось такое решение
во-первых отключаем MultiViews опцией Options -MultiViews
далее в .htaccess пишем
RewriteCond     %{REQUEST_URI}          ^(.*)/$
RewriteCond     %{REQUEST_FILENAME}     !-d
RewriteRule     ^(.*)$                  %1              [R=301,L]
(то есть, при наличии слэша в конце запроса и отсутствии такой директории на диске, перенаправляем на адрес без слэша в конце) RewriteCond     %{REQUEST_URI}          !^.*/$
RewriteCond     %{REQUEST_FILENAME}     !-f
RewriteRule     ^(.*)$                  $1.html         [L]
(а здесь уже проверяем, что если такого файла нет, то значит к нему надо добавить .html)

А если оставить MultiViews включенными — не работает, не знаю почему…

mod_rewrite и строка запроса

Нагуглил таки сегодня решение такой задачки:
вот такое правило
RewriteRule ^page1 /new_page/ [R=301,L]
запросы вида /page1?id=10 перенаправляет на /new_page/?id=10
а иногда нужно, чтобы параметры строки после ? не передавались при перенаправлении.
Как оказалось, решение заключалось в добавлении всего одного символа
RewriteRule ^page1 /new_page/? [R=301,L]

В официальной документации Apache этот трюк я не нашел, и в результате потратил кучу времени.