У меня есть веб-сайт, который использует mod_rewrite
для получения чистых URL-адресов и пользовательских страниц 404. Мой .htaccess
файл выглядит так:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?clean_url=$1 [QSA,L]
</IfModule>
Меня озадачивает то, что если URL содержит %2F
(url-encoded /
), сервер, похоже, принудительно выдает ошибку 404. Например, http://example.com/category/article
это была бы обычная статья, но затем http://example.com/category%2farticle
выдается сгенерированная сервером страница 404. (не пользовательская страница 404)
Я бы этого не ожидал... почему это происходит? Есть ли способ обойти это?
решение1
URL-адреса http://example.com/category/article
и http://example.com/category%2farticle
не равны. СогласноRFC 2616 §3.2.3зарезервированные символы имеют особое значение (в этом, в конце концов, и заключается весь смысл экранирования URL). RFC 2396 §2.2lists /
как зарезервированный символ. В контексте HTTP URL-адресов /
разделяет элементы пути, в то время как %2f
является буквальным слешем.
В языке апачи,AllowEncodedSlashes On
предотвратит немедленное отклонение запроса с кодом 404.