如果你在自定义端口上运行 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 版本。
本文译自:原文