Nginx "The plain HTTP request was went to HTTPS port"

部署完 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 注释掉

OR

ssl off;

保存并关闭,然后重启 nginx。这样,nginx 就可以同时处理 HTTP 和 HTTPS 请求了, 也就能正常转发到 HTTPS 了。

Author: ZhouYingSASA
Link: http://zhouyingsasa.xyz/2020/11/20/http400-sent-to-https/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.