相关疑难解决方法(0)

使Flask的url_for在AWS负载均衡器中使用"https"方案,而不会弄乱SSLify

我最近在我的webapp上添加了SSL证书.它部署在Amazon Web Services上使用负载均衡器.负载平衡器用作反向代理,处理外部HTTPS并发送内部HTTP.因此,尽管是安全连接,但我的Flask应用程序的所有流量都是HTTP,而不是HTTPS.

由于该网站在HTTPS迁移之前已经在线,因此我使用SSLify发送301 PERMANENT REDIRECTS到HTTP连接.尽管所有连接都是HTTP,但它仍然有效,因为反向代理X-Forwarded-Proto使用原始协议设置请求标头.

问题

url_for不关心X-Forwarded-Proto.my_flask_app.config['PREFERRED_URL_SCHEME']当方案不可用时,它将使用,但在请求期间,方案可用.与反向代理连接的HTTP方案.

因此,当有人连接时https://example.com,它会连接到负载均衡器,然后使用负载均衡器连接到Flask http://example.com.Flask看到http并假设该方案是HTTP,而不是原来的HTTPS.

这在大多数url_for模板中使用都不是问题,但任何url_for使用的_external=True都将使用http而不是https.就个人而言,我使用_external=True,rel=canonical因为我听说它是​​推荐的做法.除此之外,using Flask.redirect将使用非_external url前置http://example.com,因为重定向头必须是完全限定的URL.

例如,如果您在表单帖子上重定向,则会发生这种情况.

  1. 客户帖子 https://example.com/form
  2. 服务器发布303 SEE OTHERhttp://example.com/form-posted
  3. 然后SSLify发出一个301 PERMANENT REDIRECThttps://example.com/form-posted

由于SSLify,每次重定向都会成为2次重定向.

试图解决方案

添加PREFERRED_URL_SCHEME配置

/sf/answers/1864581631/

my_flask_app.config['PREFERRED_URL_SCHEME'] = 'https'
Run Code Online (Sandbox Code Playgroud)

不起作用,因为在请求期间存在方案,而是使用该方案.见https://github.com/mitsuhiko/flask/issues/1129#issuecomment-51759359

包装中间件以模拟HTTPS

/sf/answers/1977330421/

def _force_https(app):
    def wrapper(environ, start_response):
        environ['wsgi.url_scheme'] = 'https'
        return app(environ, start_response)
    return …
Run Code Online (Sandbox Code Playgroud)

python https amazon-web-services flask

20
推荐指数
2
解决办法
4996
查看次数

带有 ssl_context 的 Flask 服务器如果收到 http 请求就会冻结

我正在尝试创建一个简单的 Flask 服务器,将任何 http 请求重定向到 https。我已经创建了一个证书和密钥文件,并注册了一个before_request钩子来查看请求是否安全并适当重定向,遵循建议此 SO 答案

Flask 服务器按预期响应 https 请求。但是,当我发送 http 请求时,挂钩before_request永远不会被调用,并且服务器永远挂起。如果我从浏览器发送 http 请求,我会看到“ERR_EMPTY_RESPONSE”。之后服务器甚至不响应 https 请求。也没有打印任何日志。

使用 Gunicorn 运行应用程序也没有帮助。唯一的区别是,gunicorn 能够检测到工人被冻结并最终杀死并取代它。我也尝试过使用flask-talisman, 得到相同的结果。

下面是我正在运行的代码

### server.py
from flask import Flask, request, redirect


def verify_https():
    if not request.is_secure:
        url = request.url.replace("http://", "https://", 1)
        return redirect(url, 301)


def create_flask_app():
    app = Flask(__name__)
    app.before_request(verify_https)
    app.add_url_rule('/', 'root', lambda: "Hello World")
    return app


if __name__ == '__main__':
    app = create_flask_app()
    app.run(
        host="0.0.0.0",
        port=5000,
        ssl_context=('server.crt', 'server.key')
    )
Run Code Online (Sandbox Code Playgroud)

python3.8 …

python https flask gunicorn

8
推荐指数
1
解决办法
1135
查看次数

Flask 重定向混合内容错误,url 不是 https

我正在开发 Flask 应用程序。我的视图之一包含动态创建的元素。为了收集值并将它们写入我的 MongoDB 数据库,我创建了一个 JS 脚本来遍历元素并将值提取到 JS 变量。之后,我通过 AJAX $.post()方法将它们发布到我的 Flask 后端。该部分工作正常,但是当到达函数末尾时@app.route,我尝试重定向到另一个登录页面,出现以下错误:

混合内容:“ https://cocktail-recipe-book-gabyguedezh.c9users.io/get_add_cocktail_form ”页面是通过 HTTPS 加载的,但请求了不安全的 XMLHttpRequest 端点“ http://cocktail-recipe-book-gabyguedezh.c9users ” .io/get_my_recipes '. 该请求已被阻止;内容必须通过 HTTPS 提供。

POST 本身被执行,并且表单将文档发送到我的数据库,但是,重定向没有发生。

整个后端路由如下所示:

@app.route('/write_to_cocktail_database', methods=['POST'])
def write_to_cocktail_database():
    recipes = mongo.db.recipes

    recipes.insert_one(request.json)

    return redirect(url_for('get_my_recipes'))
Run Code Online (Sandbox Code Playgroud)

为了以防万一,AJAX 函数如下所示:

$.ajax({
    url: formUrl,
    // data: {'data': steps},
    data: JSON.stringify({recipe_name,  recipe_url, recipe_description,
                        recipe_image, is_vegan, ingredients, steps,
                        base_spirit, cocktail_type, flavour_profile,
                        author_name, recipe_rating, number_of_votes}, null, '\t'),
    type: 'POST',
    contentType: 'application/json;charset=UTF-8',
    success: function(response) {
        console.log('success');
    },
    error: function(error) { …
Run Code Online (Sandbox Code Playgroud)

javascript python https redirect flask

5
推荐指数
0
解决办法
1958
查看次数