【问题标题】:Flask - Why are some endpoints not HTTPS?Flask - 为什么有些端点不是 HTTPS?
【发布时间】:2018-05-16 03:24:14
【问题描述】:

我正在使用 Flask 构建一个网络应用程序。目前我正在使用 Gunicorn 为应用程序提供服务,并使用 nginx 作为反向代理。 Chrome 开发工具抱怨一个端点不是 HTTPS:

混合内容:“https://example.com:88/”处的页面通过 HTTPS 加载,但请求了不安全的 XMLHttpRequest 端点“http://example.com/geo2?coordinates=”。此请求已被阻止;内容必须通过 HTTPS 提供。

在 app.py 中,我为 Flask 设置了 HTTPS:

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 请求时重定向到此端点。代码是:

return redirect(url_for('reload_index', coordinates=coordinates))

Ajax 正在发送 POST 请求:

$.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 感到困惑。我错过了什么?我在过去几个月里自学了所有这些,所以我很可能忽略了一些东西。

【问题讨论】:

    标签: python nginx flask https gunicorn


    【解决方案1】:

    阅读Flask's documentation,它与代理讨论了这个问题。

    Flask 不知道您的代理服务器使用什么协议。您要么必须通过在 nginx 配置文件中设置适当的标头来告诉 Flask:

    proxy_set_header   X-Forwarded-Proto $scheme;
    

    然后使用中间件修复您的请求:

    from werkzeug.contrib.fixers import ProxyFix
    app.wsgi_app = ProxyFix(app.wsgi_app)
    

    【讨论】:

    • 我之前说过在 Flask 中设置 PREFERRED_URL_SCHEME 解决了这个问题,但实际上并没有。我已将中间件代码添加到我的 app.py,但 Chrome 开发控制台仍在阻止 HTTP 请求。我的 HTTPS 证书存在问题,需要先解决,然后再继续解决此问题。我还收到“405 不允许”错误和“对预检请求的响应未通过访问控制检查”错误。我怀疑这是由于我当前的证书与我的域不匹配。添加“Access-Control-Allow-Origin”标头并不能解决它。
    • @AndyForceno:对不起,我弄错了。我只使用了中间件并假设PREFERRED_URL_SCHEME 会做文档暗示的事情。如果请求是通过 HTTP 发送的,Flask 不会选择 HTTPS,只有当您自己创建请求对象时。 HTTP 405 是“不允许的方法”,这似乎不相关。我会解决证书问题。
    猜你喜欢
    • 2013-10-16
    • 2020-07-23
    • 2017-03-20
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多