flask redirect命令转到http而不是https

我在nginx服务器后面有一个flask应用程序。 Nginx处理SSL终止并重定向到https。所有http请求都被重定向。

在烧瓶中,我认为不需要了解这些内容,我有以下代码:

@bp.route('/',methods=['GET','POST'])
def index_root():
    """Assign a session tag.

    """
    return redirect(url_for('main.index',tag=make_new_tag()))

@bp.route('/D/<tag>/accueil','POST'])
def index(tag):
    return render_template('index.html',title='',tag=tag)

现在我有一个问题:当有人请求http://example.com/时,nginx将他们301传送到https://www.example.com/,这是正确的。然后将302的烧瓶重定向到http://www.example.com/D/123/accueil,这不太好,因为nginx只会将301重定向到https://www.example.com/D/123/accueil(这很好,但是我宁愿跳过该额外的重定向)。

这是某个地方的配置问题吗?

请注意,在开发人员中,烧瓶必须不要考虑https,这一点很重要。的确,flask根本不需要了解任何有关https的信息,这就是为什么我觉得这有点神秘。

感谢任何指针。

lz245548622 回答:flask redirect命令转到http而不是https

当前实现此目的的方法似乎是将x_proto=1作为参数传递给Werkzeug的ProxyFix中间件:

from werkzeug.middleware.proxy_fix import ProxyFix
app = Flask(__name__)

app.wsgi_app = ProxyFix(app.wsgi_app,x_for=1,x_proto=1)

请务必按照docs正确设置x_for。此值设置为代理服务器的数量,出于安全原因,必须正确,否则Flask可能会信任Internet用户设置的某些标头,就好像它们来自反向代理一样。危险是在没有代理时将其设置为1。

然后在nginx中确保您在X-Forwarded-Proto之前的位置块中设置proxy_pass头:

 location  / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_set_header X-Forwarded-Proto $scheme;

    proxy_pass http://localhost:9999/;
  }

我尚未使用nginx对此进行测试,但是能够通过专门在curl中设置该标头来直接针对开发服务器和gunicorn进行测试:

curl -is http://localhost:5000/  -H 'X-Forwarded-Proto: https'

这将返回:

HTTP/1.0 302 FOUND
Location: https://localhost:5000/test_str/accueil`

因此,看来url_for会生效,而无需修改代码中的单个url_for()调用,这是@PGHE链接的可接受答案的情况。

,

我已经通过使用 X-Forwarded-HTTPS 而不是 X-Forwarded-Proto

在反向代理端(Nginx)上解决了此问题
location  / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_set_header   X-Forwarded-HTTPS    on;

    proxy_pass http://localhost:9999/;
  }
本文链接:https://www.f2er.com/3128664.html

大家都在问