关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

Flask+Nginx反向代理ssl报错The plain HTTP request was sent to HTTPS port解决办法

发布时间:2023/2/19 14:28:35
香港云服务器

最近通过Nginx反向代理一个网站,环境为Flask+uwsgi+Nginx反向代理,当部署证书并设置强制跳转https以后,在浏览器输入:blog.amd5.cn访问出现了“400 Bad Request The plain HTTP request was sent to HTTPS port”错误,如下图:

image.png

一开始怀疑自己的配置有问题,反复确认和对比以后,排除配置问题。

于是网上搜索了相关报错,找到了解决方案,出现这种报错的主要原因是:

因为HTTP请求被发送到HTTPS端口,这种报错多出现在Nginx既处理HTTP请求又处理HTTPS请求的情况。

正常80端口访问应该是:http://blog.amd5.cn:80/login

正常开启HTTPS以后443端口访问应该是:https://blog.amd5.cn:443/login

但是此时却变成了: http://blog.amd5.cn:443/login,即HTTP请求被发送到HTTPS端口。

如果我直接在浏览器输入:https://blog.amd5.cn,却能正常跳转到https://blog.amd5.cn/login

直接输入http://blog.amd5.cn/login,也能正常跳转到https://blog.amd5.cn/login

为什么会有这样的问题呢,经过排查原来是多次重定向导致的,主要是因为在使用Flask-Login验证登录的时候,如果未登录,会重定向到登录页面。

通过浏览器开发者工具,可以看到,当我浏览器输入blog.amd5.cn,第一次重定向为http->https:

1
2
3
4
5
Request URL: https://blog.amd5.cn/
Request Method: GET
Status Code: 302 FOUND
Remote Address: 127.0.0.1:443
Referrer Policy: strict-origin-when-cross-origin

然后第二次重定向为:/->/login:

1
2
3
4
5
Request URL: http://blog.amd5.cn:443/login
Request Method: GET
Status Code: 400 Bad Request