qq_30042977 2024-12-25 18:29 采纳率: 100%
浏览 67
已结题

nginx配置https遇到的问题

问题遇到的现象和发生背景

nginx配置https后,主页能够使用https访问,输入用户名密码登录后不能跳转,F12发现登录的请求url自动变成了http,
访问链接使用的是https://IP地址:端口

img

尝试过的解决方法

尝试过新加一个server,使用80和443端口,将80的http请求重定向为443的https请求,能够正常使用。但由于等保安全要求,客户拒绝使用80和443端口

我想要达到的结果

希望通过nginx配置达到url不自动变成http的效果,不想动代码
以下是我的nginx配置

img

  • 写回答

28条回答 默认 最新

  • 问答-莫得感情 2024-12-25 18:34
    关注

    ️题主您好️,目前由我为您解答👇🏼
    🧡参考谷歌智能助手,由吾为汝整理提供🧡

    你的 Nginx 配置文件片段显示你使用了 proxy_pass 指令,但缺少一些关键配置导致 HTTPS 跳转失效。问题在于你的后端应用(端口 7091)可能返回了带有 HTTP URL 的重定向或资源链接。Nginx 只是忠实地转发了这些响应,因此浏览器遵循了 HTTP 的链接。

    解决这个问题的关键是在 Nginx 层面修改这些响应,将 HTTP 链接转换为 HTTPS。以下是一种解决方案,结合了解释:

    server {
        listen       5001 ssl;
        server_name  你的IP地址;
    
        ssl_certificate      /path/to/your/certificate.crt;  # 替换为你的证书路径
        ssl_certificate_key  /path/to/your/private.key; # 替换为你的私钥路径
    
        location / {
            proxy_pass http://127.0.0.1:7091; # 或你的后端服务地址
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme; #  确保后端知道连接是 HTTPS
    
            #  关键:重写 Location 头,将 http 转换为 https
            proxy_redirect http:// https://;
            #  关键:重写响应体中的 URL,将 http 转换为 https
            sub_filter 'http://你的IP地址:7091' 'https://你的IP地址:5001'; # 将7091和5001替换为你实际使用的端口
            sub_filter_once off; #  确保替换所有出现的 URL
        }
    
        #  其他 SSL 相关配置 (根据需要添加)
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers HIGH:!aNULL:!MD5;
    }
    

    解释:

    • proxy_redirect http:// https://;: 这个指令会修改后端返回的 Location 头中的 URL。如果后端返回 http://你的IP地址:7091/login 用于重定向,Nginx 会将其改为 https://你的IP地址:5001/login

    • sub_filter 'http://你的IP地址:7091' 'https://你的IP地址:5001';: 这个指令会修改响应体中的 URL。如果后端返回的 HTML 页面包含 http://你的IP地址:7091/resource 这样的链接,Nginx 会将其改为 https://你的IP地址:5001/resourcesub_filter_once off; 确保所有出现的 URL 都会被替换,而不是只替换第一个。

    • proxy_set_header X-Forwarded-Proto $scheme;: 这将告诉你的后端应用,客户端的原始请求是 HTTPS。一些后端应用使用这个头部信息来生成正确的 URL。

    重要提示:

    • 你的IP地址/path/to/your/certificate.crt/path/to/your/private.key50017091 替换为你实际使用的值。
    • 确保你的 SSL 证书有效且配置正确。
    • sub_filter 指令可能会影响性能,尤其是在处理大量数据时。如果可能,最好在后端应用中直接生成正确的 HTTPS URL。
    • 如果你的后端应用使用了相对路径(例如 /login),则不需要使用 sub_filter,只需要 proxy_redirectX-Forwarded-Proto 就足够了。

    通过这些配置,Nginx 将会拦截并修改后端返回的 HTTP 链接,确保浏览器始终使用 HTTPS 进行通信,从而解决登录跳转问题。 如果问题仍然存在,请提供更完整的 Nginx 配置以及后端应用返回的 HTTP 响应头和响应体,以便进行更精确的分析。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(27条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月26日
  • 已采纳回答 12月26日
  • 创建了问题 12月25日