Nginx 自定义端口强制 http 重定向到 https

本文最后更新于:2022年8月10日 下午

最近把 http 服务器从 Apache 迁移到了 Nginx ,服务轻了,逼格高了,问题多了。这次的问题发生的背景是,当前有一个服务,运行在自定义的端口(比如 9527),我需要这个服务强制使用 https,于是就有了我自以为无懈可击的配置:

1
2
3
4
5
6
7
8
9
server {
if ($scheme = 'http') {
return 301 https://$host:9527$request_uri;
}

listen 9527 ssl;
server_name zhuyan.io www.zhuyan.io;
...
}

结果:

400 Bad Request

The plain HTTP request was sent to HTTPS port

nginx

每次必须手动在地址前加上 https,否则就 400,真的很过分。

http 重定向 https 通常的配置方法

一般情况下,会在 nginx 配置两个虚拟主机,一个监听 80 端口,标准的 http 端口,一个监听 443 端口,标准的 https 端口。这时候只需要把所有的 80 端口流量重定向到 443 端口就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
if ($host = www.zhuyan.io) {
return 301 https://$host$request_uri;
}
if ($host = zhuyan.io) {
return 301 https://$host$request_uri;
}

listen 80;
server_name zhuyan.io www.zhuyan.io;
return 404;
}
server {
listen 443 ssl;
server_name zhuyan.io www.zhuyan.io;
...
}

这种方法无法用在自定义的端口上,因为不允许配置相同端口的 2 台虚拟主机。

Nginx 官方解决方案

Nginx 提供的一个自定义的状态码 497,来专门处理这个问题,配置方法几乎和传统的配置一样:

1
2
3
4
5
6
server {
server_name zhuyan.io www.zhuyan.io;
listen 9527 ssl;
error_page 497 https://$host:9527$request_uri;
...
}

问题解决!现在所有访问 9527 端口的 http 流量都会被正确重定向到 https。

以上。


Nginx 自定义端口强制 http 重定向到 https
https://vickey.fun/2022/08/10/nginx-force-redirect-http-to-https-in-custom-port/
作者
饶玮琪
发布于
2022年8月10日
许可协议