Обратный прокси-сервер Apache получает перенаправление

Я пытаюсь настроить Apache как обратный прокси. Вот основная часть его конфигурации:

NameVirtualHost 10.16.10.245:9443
Listen 10.16.10.245:9443

<VirtualHost 10.16.10.245:9443>
  ServerName proxy.lan:9443

  SSLEngine on
  ...

  TraceEnable off

  SSLProxyEngine on
  ProxyPreserveHost On
  ProxyRequests Off
  ProxyVia full
  ProxyPass / http://localhost/
  ProxyPassReverse / http://localhost/
</VirtualHost>

Обратите внимание, что прокси-сервер прослушивает нестандартный порт 9443. Когда я использую фиктивную страницу, показывающую phpinfo в качестве бэкэнда, все работает, как ожидалось. Однако сайт, который мне нужно разместить за прокси, либо слишком строго, либо слишком плохо написан, поэтому поведение меняется следующим образом:

client -> https://proxy.lan:443 -> http://localhost = success
client -> https://proxy.lan:<ANY_OTHER_PORT> -> http://localhost = wrong redirect

Клиент перенаправляется с https: //proxy.lan: 9443 / на https: //proxy.lan/auth/login и, очевидно, прокси не может обслуживать запрос, потому что он не прослушивает порт 443:

# wget --no-check-certificate -vS https://proxy.lan:9443
--2019-05-12 02:51:37--  https://proxy.lan:9443/
Resolving proxy.lan (proxy.lan)... 10.10.254.186
Connecting to proxy.lan (proxy.lan)|10.10.254.186|:9443... connected.
WARNING: cannot verify proxy.lan's certificate, issued by '...':
  Self-signed certificate encountered.
    WARNING: certificate common name 'backend.lan' doesn't match requested host name 'proxy.lan'.
HTTP request sent, awaiting response... 
  HTTP/1.1 302 Found
  Date: Sat, 11 May 2019 23:51:37 GMT
  Server: Apache
  Expires: Thu, 19 Nov 1981 08:52:00 GMT
  Cache-Control: no-cache, no-store, must-revalidate
  Pragma: no-cache
  Location: https://proxy.lan/auth/login
  X-Frame-Options: DENY
  X-XSS-Protection: 1; mode=block
  X-Content-Type-Options: nosniff
  Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
  Content-Security-Policy: default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'
  X-Permitted-Cross-Domain-Policies: none
  Content-Length: 0
  Content-Type: text/html; charset=UTF-8
  Set-Cookie: PHPSESSID=...; path=/; secure; HttpOnly
  Via: 1.1 proxy.lan:9443 (Apache/2.2.31)
  Connection: close
Location: https://proxy.lan/auth/login [following]
--2019-05-12 02:51:37--  https://proxy.lan/auth/login
Connecting to proxy.lan (proxy.lan)|10.10.254.186|:443... failed: Connection refused.
Resolving proxy.lan (proxy.lan)... 10.10.254.186
Connecting to proxy.lan (proxy.lan)|10.10.254.186|:443... failed: Connection refused.

Я могу вручную добавить порт в полученный URL и https: //proxy.lan: 9443 / auth / login работает, за исключением всех ссылок на странице, указывающих на https: //proxy.lan/ ...

Среда Apache выглядит так:

HTTP_HOST   proxy.lan:9443
HTTP_VIA    1.1 proxy.lan:9443 (Apache/2.2.31)
HTTP_X_FORWARDED_FOR    10.100.0.30
HTTP_X_FORWARDED_HOST   proxy.lan:9443
HTTP_X_FORWARDED_SERVER     proxy.lan
HTTP_CONNECTION     Keep-Alive
SERVER_SIGNATURE    <address>Apache Server at proxy.lan Port 9443</address>
SERVER_NAME     proxy.lan
SERVER_ADDR     ::1
SERVER_PORT     9443
REMOTE_ADDR     ::1
...

Есть идеи, что можно сделать на стороне прокси? Может быть, какие-то правила перезаписи?

-1
задан 12 May 2019 в 13:21
1 ответ

Причиной этого является ProxyPreserveHost на . Если вы не уверены, что он вам нужен, всегда оставляйте его по умолчанию выключенным , и все в порядке.

В редких случаях, когда вам действительно требуется ProxyPreserveHost на , настройте ваш ProxyPassReverse мудро - это единственная директива, которая обрабатывает перенаправления.

ProxyPassReverse / http: // localhost / выглядит неправильно в вашем сценарии, потому что ваш бэкэнд (приложение 80) не Кажется, я говорю: «Я перенаправляю вас на http: // localhost / foo / bar » куда угодно. Если вы поместите ProxyPassReverse / https: //proxy.lan/ , есть шанс, что он будет работать лучше - проверьте официальную документацию.

0
ответ дан 5 December 2019 в 20:16

Теги

Похожие вопросы