如何解决nginx 反向代理重定向到 http 而不是 https
具有以下设置:Nginx(端口 443)> Jetty(端口 9090)> Spring Controller
为了简化问题,我使用了以下文件:
- /main.html 包含调用 spring 控制器的 iframe /test
- spring 控制器 /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;
}
}
解决方法
你需要做一些事情......
-
在 nginx 端,使用来自 RFC7239 的标准
Forwarded
标头,而不是X-Forwarded-*
标头。这是因为X-Forwarded-*
标头不是标准,并且在其用法中存在含义冲突。 (在您的示例中,您将端口分开,这现在也与端口的“host”、“proto”和“for”用法冲突) -
在 Jetty 端,启用
ForwardedRequestCustomizer
。这将查找各种转发标头并相应地更新请求的权限、原型和“安全”标志。 -
在 Jetty 端,将
HttpConfiguration.securePort
配置为 nginx 上 SSL/TLS 的端口,而不是 Jetty 本身使用的端口。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。