Недавно я столкнулся с очень странной проблемой с моим экземпляром Apache, на которую не могу найти ответ, возможно, я искал не в тех местах.
Для своего веб-сайта я всегда запускаювсе запросы через мой index.php
(все остальное содержимое JS / CSS / PNG проходит через отдельный CDN), поэтому я использую свой .htaccess
для перенаправления всех запросов, например
SetEnv SERVER_ADMIN admin@example.com
SetEnv PHPRC /home/user
ServerSignature email
AddDefaultCharset UTF-8
DefaultLanguage en-US
# Enable Rewriting
RewriteEngine on
RewriteBase /
Options +FollowSymlinks
Options All -Indexes
# Do not redirect these directories
RewriteRule sitemap.xml - [L]
RewriteRule robots.txt - [L]
# Redirect to index
RewriteCond %{REQUEST_URI} !=/index.php
RewriteRule ^.*$ index.php [L]
Я прочитал путь, предоставленный из переменной $_SERVER
, $_SERVER['REQUEST_URI']
Недавно я столкнулся с проблемой, что, когда я пытаюсь отправить любой REQUEST_METHOD
на мой веб-сервер, запрос становится GET
,но только если мой URL содержит экранированный /
(%2F
).При отладке этой проблемы я print_r
'моя переменная $_SERVER
нашла следующее:
A DELETE
запрос к example.com/%2F
(Обратите внимание, что это не такконечная проблема /
, проблема возникает независимо от того, где она находится в URL, и я не убираю ее в своем коде)
{
"REDIRECT_REDIRECT_REDIRECT_REQUEST_METHOD": "DELETE",
"REDIRECT_REDIRECT_REDIRECT_STATUS": "200",
"REDIRECT_REDIRECT_SERVER_ADMIN": "admin@example.com",
"REDIRECT_REDIRECT_PHPRC": "/home/user",
"REDIRECT_REDIRECT_HTTPS": "on",
"REDIRECT_REDIRECT_SSL_TLS_SNI": "www.example.com",
"REDIRECT_REDIRECT_STATUS": "200",
"REDIRECT_HTTP_AUTHORIZATION": "",
"REDIRECT_SERVER_ADMIN": "admin@example.com",
"REDIRECT_PHPRC": "/home/user",
"REDIRECT_HTTPS": "on",
"REDIRECT_SSL_TLS_SNI": "www.example.com",
"REDIRECT_STATUS": "200",
"HTTPS": "on",
"SSL_TLS_SNI": "www.example.com",
"HTTP_HOST": "www.example.com",
"REQUEST_METHOD": "GET",
"REQUEST_URI": "/%2F",
"SCRIPT_NAME": "/index.php"
}
A DELETE
запрос к example.com
{
"REDIRECT_REDIRECT_SERVER_ADMIN": "admin@example.com",
"REDIRECT_REDIRECT_PHPRC": "/home/user",
"REDIRECT_REDIRECT_HTTPS": "on",
"REDIRECT_REDIRECT_SSL_TLS_SNI": "www.example.com",
"REDIRECT_REDIRECT_STATUS": "200",
"REDIRECT_SERVER_ADMIN": "admin@example.com",
"REDIRECT_PHPRC": "/home/user",
"REDIRECT_HTTPS": "on",
"REDIRECT_SSL_TLS_SNI": "www.example.com",
"REDIRECT_STATUS": "200",
"HTTPS": "on",
"SSL_TLS_SNI": "www.example.com",
"HTTP_HOST": "www.example.com",
"REQUEST_METHOD": "DELETE",
"REQUEST_URI": "/",
"SCRIPT_NAME": "/index.php"
}
Мне еще предстоит выяснить, почему этот экранированный символ вызывает дополнительное перенаправление и почему он изменяет метод запроса. Я наткнулся на одно предложение на SO , чтобы заменить RewriteRule [L]
на RewriteRule [P]
для прокси запроса, но это только вызвало ошибки.В документации RewriteRule Flags указано, что правило прокси-сервера следует использовать с внешним URL-адресом.
Будем весьма благодарны за любые предложения и / или помощь.