обратный прокси-сервер nginx перенаправляет на http вместо https

#nginx #redirect #jetty #reverse-proxy #nginx-reverse-proxy

#nginx #перенаправление #причал #обратный прокси #nginx-reverse-proxy

Вопрос:

Имея следующую настройку: NGINX (порт 443)> Jetty (порт 9090)> Spring Controller

Для упрощения проблемы я использую следующие файлы:

  • /main.html содержащий iframe, вызывающий spring controller / test
  • весенний контроллер / выполнение теста return "redirect:/iframe.html";
  • /iframe.html с простым текстом, говорящим «Это IFrame».

С HTTP проблем нет, но после переключения конфигурации NGINX на HTTPS я получаю следующую ошибку в браузере, и iframe не отображается:

main.html:7 Смешанный контент: страница в ‘https://dev/main.html «был загружен по протоколу HTTPS, но запросил небезопасный фрейм»http://dev/iframe.html «. Этот запрос заблокирован; содержимое должно передаваться по протоколу HTTPS.

Таким образом, контроллер перенаправляет на http вместо https, это моя конфигурация NGINX, которая, насколько я понимаю, должна сообщать причалу / контроллеру, что он работает на https:

  server {
    listen 443      ssl http2;
    listen [::]:443 ssl http2;
    server_name dev;

    ssl on;
    ssl_certificate ...;
    ssl_certificate_key ...;

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Port $server_port;
        
        proxy_ssl_name $host;
        proxy_ssl_server_name on;

        proxy_pass http://127.0.0.1:9090;
    }
}
 

Ответ №1:

Вам нужно сделать несколько вещей …

  1. На стороне nginx используйте стандартный Forwarded заголовок из RFC7239, а не X-Forwarded-* заголовки. Это связано с тем, что X-Forwarded-* заголовки не являются стандартными и конфликтуют по смыслу при их использовании. (в вашем примере вы разделили порт, который теперь конфликтует с «хостом», «прототипом» и «для» использования для порта)
  2. На стороне причала включите ForwardedRequestCustomizer . Это будет искать различные заголовки пересылки и соответствующим образом обновлять полномочия запроса, протоколы и флаги «is secure».
  3. На стороне Jetty настройте HttpConfiguration.securePort порт для вашего SSL / TLS на вашем nginx, а не порт, который использует сам Jetty.

Комментарии:

1. Все, что мне нужно было сделать, это добавить ‘jetty-http-forwarded.xml — к конфигурации причала, и это сработало. Который затем активирует ForwardedRequestCustomizer. Спасибо.