服务器问答

关于 Nginx 配置 HTTP 跳转非 443 端口 HTTPS 的问题
0
2021-05-19 15:49:46
idczone

如果正常的,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;
}
s抗投诉服务器erver {
    listen 8443 ssl http2;
    server_name xxxxx.com;

    ssl_verify_client on;
    
    ............
}

我只试过重定向到非 443 的 https 端口,没有实践过 http 和 https 绑定到同一个端口,如果你那个配置没有出现报错的话,把 return 301 那里改成
return 301 https://$host:8443$request_uri;
应该就可以了

default_server 应该是 example.com 吧

没遇到过这种,但是猜测应该写个 if 判断协议来实现跳转

受一楼启发,以 nginx http https same port 搜索,看到几个解决方式,楼主可以试试
https://www.nginx.com/blog/running-non-ssl-protocols-over-ssl-port-nginx-1-15-2/
https://stackoverflow.com/questions/15429043/how-to-redirect-on-the-same-port-from-http-to-https-with-nginx-reverse-proxy
https://stackoverflow.com/questions/40996334/how-to-force-ssl-tls-on-nginx-on-a-single-port

看了一下,基本方案是这个端口只配置 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

楼上的
error_page 497 https://$host$request_uri;
以前试过好像是可以把非 443 端口的直接跳转到 HTTPS 的。

不用监听 80 端口,直接监听 8443 端口,然后这样配置
server {
listen 8443 ssl http2;
server_name xxxxx.com;
error_page 497 https://$host:8443$request_uri;
............
}
@iflyime


正解,我的服务器就是这样配置的。原理是把 The plain HTTP request was sent to HTTPS port 的错误页跳转到加了 https:// 的页面。5 楼的方案漏了端口号,7 楼这个应该完美符合楼主场景。

8443 rewrite 就可以了

这个试过了,貌似是这一个非 ssl 的 server 就完全没有生效,不发生任何跳转。
emmmm,这只是个样例代码……
后两个链接里的可以,谢谢啦~
497 错误代码可以的,需要加上端口号,谢谢啦~
你的这个代码可以正常跳转,谢谢~

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服