Вопрос

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top