#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:
Вам нужно сделать несколько вещей …
- На стороне nginx используйте стандартный
Forwarded
заголовок из RFC7239, а неX-Forwarded-*
заголовки. Это связано с тем, чтоX-Forwarded-*
заголовки не являются стандартными и конфликтуют по смыслу при их использовании. (в вашем примере вы разделили порт, который теперь конфликтует с «хостом», «прототипом» и «для» использования для порта) - На стороне причала включите
ForwardedRequestCustomizer
. Это будет искать различные заголовки пересылки и соответствующим образом обновлять полномочия запроса, протоколы и флаги «is secure». - На стороне Jetty настройте
HttpConfiguration.securePort
порт для вашего SSL / TLS на вашем nginx, а не порт, который использует сам Jetty.
Комментарии:
1. Все, что мне нужно было сделать, это добавить ‘jetty-http-forwarded.xml — к конфигурации причала, и это сработало. Который затем активирует ForwardedRequestCustomizer. Спасибо.