部署完 HTTPS 的我满怀欣慰地看着浏览器上的小锁,关机睡觉。
第二天再访问发现居然 400 了?
…
400 Bad request
The plain HTTP request was sent to HTTPS port
----------------------------------------------------
nginx
眉头一皱,发现事情不简单。
这好像不是以前常见的 400?
网上搜索一番,心中有了*数。
从报错的字面意思上来看,是因为HTTP请求被发送到HTTPS端口。
这种报错多出现在 Nginx 既处理 HTTP 请求又处理 HTTPS 请求的情况。
但是用户想通过80端口来访问网站时,例如使用http://example.com,那么这个用户就会在浏览器收到错误:
400 Bad Request. The plain HTTP request was sent to HTTPS port.
出现这个错误,因为请求试图通过HTTP访问你的网站,而这个请求被重定向到HTTPS。
于是在 HTTPS 下 Nginx 想依照配置文件使用 SSL 交互。
但原来的请求(通过端口80接收)是普通的 HTTP 请求, 于是就会产生错误。
另一方面,如果一个请求使用 HTTPS 直接访问网站,那么就不会遇到上述错误。
此外,如果你有其他的网站配置为不使用 SSL, Nginx 会尝试使用 HTTPS,这种情况下也会造成上述错误。
遇到这种情况,可以在相应配置中更改:
# ssl on; // 将 on 注释掉 |
保存并关闭,然后重启 nginx。这样,nginx 就可以同时处理 HTTP 和 HTTPS 请求了, 也就能正常转发到 HTTPS 了。