Apache .htaccess проблема перенаправления - PullRequest
1 голос
/ 07 мая 2019

Недавно я столкнулся с очень странной проблемой с моим экземпляром 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-адресом.

Будем весьма благодарны за любые предложения и / или помощь.

1 Ответ

0 голосов
/ 17 мая 2019

Наконец-то решили проблему с дальнейшим копанием в StackOverflow.

Первая идея состояла в том, чтобы просто прочитать $_SERVER['REDIRECT_REDIRECT_METHOD'], но я бы НЕ рекомендовал это сделать, поскольку выясняется, что Apache также форсирует код ответа 404 во время этого перенаправления, то есть любые URL с кодировка %2F возвращалась как Not Found (даже при отображении содержимого моей страницы).

Ответ пришел от на этот другой вопрос .

Решение:

# Set this rule in .htaccess/httpd.conf
AllowEncodedSlashes NoDecode
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...