У меня есть следующие перенаправления в <VirtualHost *:80>
:
RewriteRule ^/old-url$ /new-url [R=301,L]
RewriteRule ^/foo$ /bar [R=301,L]
...
Перед apache у меня есть haproxy, прослушивающий 80 и 443, последний выполняет завершение SSL и:
http-request set-header X-Forwarded-Port %[dst_port]
http-request set-header X-Forwarded-Proto https if { ssl_fc }
Моя проблема с переадресацией в том, что:
Как я могу убедиться http
перенаправляет на http
и https
к https
? Обратите внимание, что я хочу избежать необходимости дважды писать правила перенаправления. Как я мог использовать X-Forwarded-Proto
или X-Forwarded-Port
перенаправить на правильную схему?
Поскольку перенаправление всегда будет содержать абсолютный URL-адрес, вам необходимо сделать свои перенаправления полным URL-адресом, например:
RewriteEngine On
RewriteRule "^/foo" "%{HTTP:X-Forwarded-Proto}://%{HTTP_HOST}/bar" [R=301]
Чтобы это работало во всех случаях, вы должны быть уверены, что X-Forwarded-Proto всегда правильный, поэтому он должен содержать «http» для простых HTTP-соединений (я считаю, что haproxy не устанавливает его явно, поэтому вы нужно сделать так). Кроме того, сервер Apache должен получить Host:
заголовок, поэтому, если haproxy вызывает сервер Apache по IP, вам необходимо заменить %{HTTP_HOST}
часть с фактическим именем хоста.