nginx 常规端口和非常规端口的 http redirect to https
常规端口 standard port
常规端口很简单,使用两个 server 块,一个监听 80 做跳转,一个监听 443 做实际 serving
server {
listen 80 default_server;
server_name xxx.example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name xxx.example.com;
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
ssl_trusted_certificate /path/to/chain.pem;
...
}
http 重定向所有流量到 https 的方法有好几个,以上是推荐的一种写法。
非常规端口 non-standard port
假如我使用 37878 这个端口作为服务端口,用户访问 http://xxx.example.com:37878/ 我们要将它自动重定向到 https://xxx.example.com:37878/
使用以上的方法就不行了。
nginx 创建了一个自定义的 HTTP status code,允许 http 到 https 的跳转,这个状态码是 497
。这只有在非常规端口/自定义端口上运行 SSL 时才需要这样做,否则一般用常规端口的跳转设置方法。
只有一个 server 块
server {
listen 37878 ssl http2;
server_name xxx.example.com;
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
ssl_trusted_certificate /path/to/chain.pem;
error_page 497 https://$server_name:37878$request_uri;
...
}
添加上面这一行 error_page 497 https://$server_name:37878$request_uri;
就可以了。
通过 curl 发现这是 302 临时重定向 HTTP/1.1 302 Moved Temporarily。