Назад | Перейти на главную страницу

Apache возвращает неправильный заголовок Location

Проблема возникает, когда вы:

  1. отправить запрос с заголовком "Хост", включая порт, например "Host: www.example.com:80", что допустимо согласно https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.23. Вы можете сделать это, например, с помощью curl curl -v -H "Host: www.example.com:80" -X GET -i http://www.example.com
  2. сервер выдает перенаправление на https для этого запроса, в моем случае с использованием следующего RewriteRule
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Я заметил, что заголовок ответа «Location» также включает порт, и он такой же, как тот, который указан в заголовке «Host» запроса. Таким образом, сервер ответит «Местоположение: https://www.example.com:80", что неверно.

Это случается со мной с Apache / 2.4.7 (Ubuntu), но я заметил проблему также с сервером кеширования Varnish. Почему он так себя ведет? Есть способ исправить это?

HTTP_HOST относится к указанному заголовку Host:, поэтому ваша конфигурация работает должным образом в зависимости от того, что вы ей указываете.

Если вы хотите, вы можете либо удалить порт, либо указать другой, сопоставив его и используя обратную ссылку:

Удалить порт и по умолчанию https:

RewriteCond %{HTTP_HOST} ^([^:]+)(:[0-9]+)?$
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]

Измените порт на другой (здесь 8443):

RewriteCond %{HTTP_HOST} ^([^:]+)(:[0-9]+)?$
RewriteRule ^ https://%1:8443%{REQUEST_URI} [R=301,L]