Flask经Nginx多前缀代理后跳转丢失路由前缀问题咨询
该问题是由于Flask应用感知不到外层Nginx配置的访问前缀,生成的页面链接默认以根路径为基准,因此跳转时丢失了/prod1这类前缀。推荐通过Nginx与Flask配合修改的方式解决,稳定性最高。
Nginx侧配置调整
在每个对应的location配置块中,新增请求头传递前缀信息,修改后的配置示例如下:
server { listen 8888; location /dev1 { proxy_pass http://127.0.0.1:8000/; proxy_set_header Host $host; proxy_set_header X-Forwarded-Prefix /dev1; } location /prod1 { proxy_pass http://127.0.0.1:8001/; proxy_set_header Host $host; proxy_set_header X-Forwarded-Prefix /prod1; } location /prod2 { proxy_pass http://127.0.0.1:8002/; proxy_set_header Host $host; proxy_set_header X-Forwarded-Prefix /prod2; } location /prod3 { proxy_pass http://127.0.0.1:8003/; proxy_set_header Host $host; proxy_set_header X-Forwarded-Prefix /prod3; } }
Flask侧配置调整
- 首先确保页面内所有跳转链接不要硬写
/link1这类绝对路径,统一使用Flask提供的url_for()函数生成路径,模板中写法为{{ url_for('link1') }},后端跳转写法为redirect(url_for('link1'))。 - 给Flask应用添加代理中间件,自动识别Nginx传递的前缀,自动补全到生成的路径中,配置代码如下:
from flask import Flask from werkzeug.middleware.proxy_fix import ProxyFix app = Flask(__name__) # 开启前缀识别,x_prefix=1表示读取一层X-Forwarded-Prefix头 app.wsgi_app = ProxyFix(app.wsgi_app, x_prefix=1) @app.route("/") @app.route("/link1") def link1(): ...
如果不想用自动识别,也可以硬写当前实例的应用根路径,比如prod1的实例配置:
app.config['APPLICATION_ROOT'] = '/prod1'
配置完成后,Flask生成的所有路径都会自动带上对应前缀,跳转后路径就会变为/prod1/link1符合预期。
临时应急方案(仅Nginx修改,不推荐长期使用)
如果暂时无法修改Flask代码,可以在Nginx中添加重写规则强制补全前缀,但仅适用于固定路径场景,维护成本很高:
# 以prod1场景为例,所有根路径下的请求都重写到/prod1下 rewrite ^/(.*)$ /prod1/$1 permanent;
内容的提问来源于stack exchange,提问作者Kenji
相关产品推荐
相关产品推荐

