常规端口 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