Python Flask-为什么有些端点不是HTTPS?
我正在使用Flask构建一个web应用程序。目前,我使用Gunicorn为应用程序提供服务,使用nginx作为反向代理。Chrome开发工具抱怨一个端点不是HTTPS: 混合内容:处的页面通过HTTPS加载,但请求了不安全的XMLHttpRequest端点。此请求已被阻止;内容必须通过HTTPS提供 在app.py中,我为Flask设置了HTTPS:Python Flask-为什么有些端点不是HTTPS?,python,nginx,flask,https,gunicorn,Python,Nginx,Flask,Https,Gunicorn,我正在使用Flask构建一个web应用程序。目前,我使用Gunicorn为应用程序提供服务,使用nginx作为反向代理。Chrome开发工具抱怨一个端点不是HTTPS: 混合内容:处的页面通过HTTPS加载,但请求了不安全的XMLHttpRequest端点。此请求已被阻止;内容必须通过HTTPS提供 在app.py中,我为Flask设置了HTTPS: context = ('ssl/server.crt', 'ssl/server.key') app.run(host='0.0.0.0', po
context = ('ssl/server.crt', 'ssl/server.key')
app.run(host='0.0.0.0', port=443, ssl_context=context, threaded=True, debug=True)
我正在执行gunicorn的以下任务:
gunicorn --bind 0.0.0.0:8282 app:app
为了简洁起见,我的nginx配置省去了所有SSL设置:
server {
listen 88 ssl;
server_name example.com www.example.com;
root /var/www/app/;
index index.html;
location / {
proxy_pass http://192.168.1.5:8282/;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $server_name;
}
}
我注意到我只在一个端点/geo2上看到这个错误。我的应用程序设置为在/geo接收POST请求时重定向到此端点。其代码为:
返回“重新加载索引”的重定向URL\u,坐标=坐标
POST请求由Ajax发送:
$.ajax({
type: "POST",
url: "/geo",
contentType: "application/json; charset=utf-8",
data: JSON.stringify(coordinates),
dataType: "json",
success: function(response) {
console.log(response);
},
error: function(err) {
console.log(err);
}
});
考虑到Flask被设置为使用HTTPS,我不明白为什么任何端点都是HTTP。我错过了什么?在过去的几个月里,我自学了所有这些,所以很可能我忽略了一些东西。阅读与代理讨论这个问题的文章
Flask不知道代理服务器使用的是什么协议。您可以通过在nginx配置文件中设置适当的头来告诉Flask:
proxy_set_header X-Forwarded-Proto $scheme;
然后使用中间件修复您的请求:
from werkzeug.contrib.fixers import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app)
阅读与代理讨论此问题的文章
Flask不知道代理服务器使用的是什么协议。您可以通过在nginx配置文件中设置适当的头来告诉Flask:
proxy_set_header X-Forwarded-Proto $scheme;
然后使用中间件修复您的请求:
from werkzeug.contrib.fixers import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app)
我之前说过,在Flask中设置首选的URL方案解决了这个问题,但事实上并没有。我已经在app.py中添加了中间件代码,但是Chrome开发控制台仍然在阻止HTTP请求。我的HTTPS证书有一个问题,需要在继续对此进行故障排除之前解决。我还得到一个405不允许的错误,并且对飞行前请求的响应未通过访问控制检查错误。我怀疑这是因为我当前的证书与我的域不匹配。添加“Access Control Allow Origin”标题无法解决此问题。@AndyForceno:对不起,我弄错了。我只使用了中间件,并假设PREFERRED_URL_方案会像文档所暗示的那样。如果请求是通过HTTP发送的,则不必选择HTTPS,只有在您自己创建请求对象的情况下才能选择HTTPS。HTTP 405是不允许的方法,它似乎不相关。我会解决证书问题。我之前说过,在Flask中设置首选的\uURL\u方案解决了这个问题,但事实上并没有。我已经在app.py中添加了中间件代码,但是Chrome开发控制台仍然在阻止HTTP请求。我的HTTPS证书有一个问题,需要在继续对此进行故障排除之前解决。我还得到一个405不允许的错误,并且对飞行前请求的响应未通过访问控制检查错误。我怀疑这是因为我当前的证书与我的域不匹配。添加“Access Control Allow Origin”标题无法解决此问题。@AndyForceno:对不起,我弄错了。我只使用了中间件,并假设PREFERRED_URL_方案会像文档所暗示的那样。如果请求是通过HTTP发送的,则不必选择HTTPS,只有在您自己创建请求对象的情况下才能选择HTTPS。HTTP 405是不允许的方法,它似乎不相关。我会解决证书问题。