htaccess переписать не работает для всех правил - PullRequest
0 голосов
/ 28 октября 2009

Это очень странная проблема, и я просто надеюсь, что смогу ее четко объяснить.

По сути, сегодня мы сделали серьезное обновление на клиентском сайте, и нам нужно было обновить некоторые правила перезаписи в 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 и другие файлы конфигурации, но не можем найти никаких ссылок на носители или другие сломанные перенаправления (всего три) - поэтому мы в замешательстве.

Ответы [ 2 ]

2 голосов
/ 28 октября 2009

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

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

AcceptPathInfo Off

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

-

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

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

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

Кроме того, вы можете уменьшить количество правил, комбинируя похожие; e.g.:

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

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

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

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

1 голос
/ 04 ноября 2009

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

...