перезапись htaccess не работает для всех правил
-
06-07-2019 - |
Вопрос
Это очень странная проблема, и я просто надеюсь, что смогу ее доходчиво объяснить.
По сути, сегодня мы сделали серьезное обновление на клиентском сайте, и нам нужно было обновить некоторые правила перезаписи в 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 из корня документа, мы получили ошибку 404.Что-то где-то все еще сопоставляет /media с media.php и игнорирует правило перезаписи.
Странно то, что все остальные правила перезаписи в файле работают нормально, а их там около 20 или около того.
Мы отследили vhost и другие файлы конфигурации, но не смогли найти никаких упоминаний о носителях или других неработающих перенаправлениях (всего три) — поэтому мы в тупике.
Решение 2
Отключение параметра MultiViews на сайте .htaccess устранило проблему - казалось, это включало согласование содержимого, которое обрабатывалось до правил перезаписи.
Другие советы
Я сильно подозреваю, что это связано с 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-адрес.