首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
jinliming2
V2EX  ›  NGINX

关于 Nginx 配置 HTTP 跳转非 443 端口 HTTPS 的问题

  •  
  •   jinliming2 · 126 天前 · 2586 次点击
    这是一个创建于 126 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如果正常的,80 端口 HTTP 跳转 HTTPS,那么直接在 server listen 80 下写 return 301 https://$host$request_uri; 就行

    但是,现在的情况是,80/443 都有服务了,然后在 8443 端口上开了一个需要客户端证书认证的 TLS 双向认证服务,通过 https://example.com:8443 可以成功访问,浏览器会提示选择客户端证书,这都没问题。

    但是在首次访问的时候,如果没有显式指定 https 协议,将会自动默认使用 http 协议来访问 8443 端口,导致 nginx 报错:400 Bad Request: The plain HTTP request was sent to HTTPS port。

    所以,有没有什么办法可以让 http://example.com:8443 自动跳转到 https://example.com:8443

    尝试过这样配置,但不行:

    server {
        listen 8443 default_server;
    
        return 301 https://$host$request_uri;
    }
    server {
        listen 8443 ssl http2;
        server_name xxxxx.com;
    
        ssl_verify_client on;
        
        ............
    }
    
    第 1 条附言  ·  126 天前
    已解决:
    不需要两个 server 块,只需要捕获 497 错误就行了:
    ```
    server {
    listen 8443 ssl http2;
    server_name xxxxx.com;

    error_page 497 301 =307 https://$host:$server_port$request_uri;

    ssl_verify_client on;

    ............
    }
    ```
    代码参考了 4 楼第二个链接里的,用了 307 状态码。
    10 条回复    2020-03-02 12:14:03 +08:00
    xiri
        1
    xiri   126 天前 via Android   ❤️ 1
    我只试过重定向到非 443 的 https 端口,没有实践过 http 和 https 绑定到同一个端口,如果你那个配置没有出现报错的话,把 return 301 那里改成
    return 301 https://$host:8443$request_uri;
    应该就可以了
    chengxy
        2
    chengxy   126 天前
    default_server 应该是 example.com
    uqf0663
        3
    uqf0663   126 天前
    没遇到过这种,但是猜测应该写个 if 判断协议来实现跳转
    seki
        5
    seki   126 天前   ❤️ 1
    看了一下,基本方案是这个端口只配置 https,加一个对 nginx 497 错误的处理来改变协议,写成

    error_page 497 https://$host$request_uri;

    没实际试过,不知道非标准端口需不需要加上端口号

    参考 https://stackoverflow.com/questions/14144514/can-i-redirect-non-ssl-traffic-that-comes-in-on-an-ssl-port-with-nginx
    iflyime
        6
    iflyime   126 天前 via Android
    楼上的

    error_page 497 https://$host$request_uri;

    以前试过好像是可以把非 443 端口的直接跳转到 HTTPS 的。
    iflyime
        7
    iflyime   126 天前 via Android   ❤️ 1
    不用监听 80 端口,直接监听 8443 端口,然后这样配置

    server {
    listen 8443 ssl http2;
    server_name xxxxx.com;
    error_page 497 https://$host:8443$request_uri;
    ............
    }

    @iflyime
    mgrddsj
        8
    mgrddsj   126 天前
    @iflyime #7
    正解,我的服务器就是这样配置的。原理是把 The plain HTTP request was sent to HTTPS port 的错误页跳转到加了 https:// 的页面。5 楼的方案漏了端口号,7 楼这个应该完美符合楼主场景。
    zvc888
        9
    zvc888   126 天前
    8443 rewrite 就可以了
    jinliming2
        10
    jinliming2   126 天前
    @xiri 这个试过了,貌似是这一个非 ssl 的 server 就完全没有生效,不发生任何跳转。
    @chengxy emmmm,这只是个样例代码……
    @zhengjian 后两个链接里的可以,谢谢啦~
    @seki 497 错误代码可以的,需要加上端口号,谢谢啦~
    @iflyime 你的这个代码可以正常跳转,谢谢~
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4444 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 08:49 · PVG 16:49 · LAX 01:49 · JFK 04:49
    ♥ Do have faith in what you're doing.