我正在尝试使用路径上下文在 nginx 后面部署一个 Gunicorn + Flask 应用程序(https://example.com/my-app)
应用程序使用gunicorn + Flask在本地运行良好,为gunicorn运行时设置环境变量“SCRIPT_NAME”(实际上是VS Code中的启动配置)。
"env": {
"SCRIPT_NAME": "/my-app",
然后
request.script_name
变成 /my-app
,正如预期的那样。
当我尝试将 SCRIPT_NAME 设置为 nginx 中的标头时
location /my-app/ {
include proxy_params;
proxy_set_header SCRIPT_NAME "/my-app";
proxy_pass http://localhost:5000;
}
我可以看到
Script-Name: /my-app
在 Flask 应用程序的 request.headers 中
但是,
request.script_name
为空,因此所有 url_for(...) 都无法正常工作。
P.S.:我尝试在服务描述符中设置gunicorn的环境变量,但在(访问)日志中它没有显示。无论如何,标头解决方案似乎更合适,因为它将前缀保留在我将其安装到服务器其余部分的位置。
物有所值。我找到了我的问题和解决方案。
SCRIPT_NAME 标头被
覆盖proxy_set_header X-Forwarded-Prefix /;
隐藏在
proxy_params
包含文件中。
删除这个前缀会导致gunicorn在flask中设置正确的标头,并且flask的 url_for() 表现如预期。