微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

nginx 反向代理重定向到 http 而不是 https

如何解决nginx 反向代理重定向到 http 而不是 https

具有以下设置:Nginx(端口 443)> Jetty(端口 9090)> Spring Controller

为了简化问题,我使用了以下文件

  • /main.html 包含调用 spring 控制器的 iframe /test
  • spring 控制器 /testreturn "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 端,使用来自 RFC7239 的标准 Forwarded 标头,而不是 X-Forwarded-* 标头。这是因为 X-Forwarded-* 标头不是标准,并且在其用法中存在含义冲突。 (在您的示例中,您将端口分开,这现在也与端口的“host”、“proto”和“for”用法冲突)

  2. 在 Jetty 端,启用 ForwardedRequestCustomizer。这将查找各种转发标头并相应地更新请求的权限、原型和“安全”标志。

  3. 在 Jetty 端,将 HttpConfiguration.securePort 配置为 nginx 上 SSL/TLS 的端口,而不是 Jetty 本身使用的端口。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。