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

Apache перенаправляет через завершающий прокси-сервер SSL

У меня есть следующие перенаправления в <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 }

Моя проблема с переадресацией в том, что:

  1. http://example.com/foo правильно перенаправляет на http://example.com/bar
  2. https://example.com/foo ошибочно перенаправляет на http://example.com/bar

Как я могу убедиться 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} часть с фактическим именем хоста.