2009-10-28 4 views
0

Это очень странная проблема, и я просто надеюсь, что я могу это объяснить.htaccess rewrite не работает для всех правил

В основном, мы сделали большое обновление на сайте клиента сегодня, и необходимо обновить некоторые правила перезаписи в Htaccess для размещения новой структуры и т.д. ...

Итак, где мы первоначально были такие вещи, как:

RewriteRule ^/resources/?$ index.php?id=resources 
RewriteRule ^/media/?$  media.php 

мы изменили на:

RewriteRule ^/resources/?$ index.php?id=resources 
RewriteRule ^/media/?$  index.php?id=media 

Но когда мы посетили http://www.example.com/media - это показывало старой страницы средств массовой информации. Затем, когда мы удалили старый media.php из корня документа, мы получили 404s. Что-то где-то еще отображается/media media.php и игнорирует правило перезаписи.

Странная вещь - все остальные правила перезаписи в файле работают нормально - и там около 20 или около того.

Мы отслеживали и обновляли vhost и другие файлы конфигурации, но не можем найти ссылки на носители или другие сломанные переадресации (всего три), поэтому мы в тупике.

+0

Вы перезапустили веб-сервер? – Gumbo

+0

Да, мы сделали - хотя это не должно нормально влиять на уровень каталогов htaccess (и это не так) – HorusKol

+0

Но при использовании mod_rewrite в файле .htaccess префикс пути для каждого каталога удаляется из URI запроса и, следовательно, также требуется для удаления из рисунка. Таким образом, данные правила не должны вообще работать в файле .htaccess. – Gumbo

ответ

1

Отключение опции MultiViews на сайте .htaccess исправил проблему - казалось, что это разрешало согласование содержимого, которое обрабатывалось перед правилами перезаписи.

2

Я сильно подозреваю, что это связано с AcceptPathInfo, которое, на мой взгляд, является неправильной функцией Apache. По умолчанию я считаю, что он включен, где PHP является обработчиком.

Попробуйте добавить к вашему .htaccess, или, предпочтительно, ваш httpd.conf (и перезапустить):

AcceptPathInfo Off 

См: http://httpd.apache.org/docs/2.2/mod/core.html#acceptpathinfo

-

Несколько боковых точек:

Вы должны убедиться, что ваш RewriteRules всегда заканчивается [L], когда вы нашли совпадение - это поможет в отладке. Например:

RewriteRule ^/media/?$  index.php?id=media [L] 

Кроме того, вы можете уменьшить количество правил, объединив аналогичные; например:

RewriteRule ^/(media|resources)/?$ index.php?id=$1 [L] 

Лично я считаю, что использование /? в конце вашего первого полугодия это не хорошо, потому что это означает, что оба URL работают без перенаправления, что означает, что у вас нет окончательного, который является «правильным». Лично я хотел бы использовать:

RewriteRule ^/(media|resources)/$ index.php?id=$1 [L] 
RewriteRule ^/(media|resources)$ /$1/ [L,R] 

Другими словами, уникальный ресурс должен иметь один, канонический (окончательный) URL.

+0

Некоторые хорошие моменты там - к сожалению, это древний сайт, и до сих пор я был в значительной степени последователен схему, изложенную предыдущими разработчиками (после того, как она «недостаточно разрывается, чтобы оправдать фиксацию»). Оказывается, проблема в том, что проблема была включена MultiViews ... теперь мне нужно выяснить, является ли это «безопасным», чтобы отключить его. – HorusKol

Смежные вопросы