Flask - 为什么有些端点不是HTTPS?

时间:2017-12-02 00:18:51

标签: python nginx flask https gunicorn

我正在使用Flask构建一个Web应用程序。目前我正在使用Gunicorn为应用程序提供服务,而nginx则用作反向代理。 Chrome Dev工具抱怨一个端点不是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 --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);
    }
});

我很困惑为什么任何端点都是HTTP,因为Flask设置为使用HTTPS。我错过了什么?我在过去的几个月里自学了这一切,所以我很有可能忽视了一些事情。

1 个答案:

答案 0 :(得分:4)

阅读与代理讨论此问题的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)