【奇技淫巧】Nginx 在自定义端口上强制将 HTTP 重定向到 HTTPS

如果你在自定义端口上运行 Nginx 虚拟主机(vhost),并启用了 SSL,那么使用 HTTP 而非 HTTPS 访问该网站时,就会触发以下 Nginx 错误:

400 Bad Request
The plain HTTP request was sent to HTTPS port
nginx

意思是:400 请求错误:将普通 HTTP 请求发送到了 HTTPS 端口。

例如,下面的虚拟主机配置在非标准端口 1234 上启用了 SSL,使用 HTTP 访问时就会出现上述错误:

server {
  listen      1234 ssl;
  server_name your_site;
  ...
}

将 HTTP 重定向到 HTTPS 的传统方法

强制将 HTTP 重定向到 HTTPS 的传统方法是:配置一个虚拟主机监听 80 端口,另一个监听 443 端口,并让监听 80 端口的虚拟主机将所有流量重定向到 HTTPS 版本。

server {
  listen      80;
  server_name your.site.tld;

  # 301 = 永久重定向,302 = 临时重定向
  return 301  https://your.site.tld$request_uri;
}

server {
  listen      443 ssl;
  server_name your.site.tld;
  ...
}

但是,如果你在自定义端口上运行 HTTPS/SSL,就无法使用这一方法,因为请求并不会经过可用于接收非加密 HTTP 请求并执行重定向的 80 端口。

在非标准端口上强制重定向到 HTTPS

Nginx 定义了一个自定义的 HTTP 状态码 497,可用于将通过 HTTP 访问虚拟主机的请求强制重定向到 HTTPS 版本。只有在自定义端口上运行 SSL 时才需要使用这种方式;否则,可以使用上面的配置来实现重定向。

要强制浏览器从 HTTP 重定向到 HTTPS 端口,请进行如下配置:

server {
  listen      1234 ssl;
  server_name your.site.tld;
  ...
  error_page  497 https://$host:1234$request_uri;
  ...
}

这样,任何通过 HTTP 协议访问该网站的用户,都会被重定向到 HTTPS 版本。


本文译自:原文

# nginx 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×