Python gunricorn+的烧瓶重定向(url_for)错误;nginx
我的flask应用程序中的重定向(url_for)函数有问题 任何重定向(url_for(“index”)行都会将应用程序从domain.com/app重定向到ip addr/app,其中ip addr是我自己的客户端机器ip,而不是服务器的 这让我非常困惑,我不知道问题到底发生在哪里,因为它只发生在服务器上,而不发生在任何本地测试上 详细信息: 我正在使用此处找到的反向代理设置。 我的nginx配置是这样设置的Python gunricorn+的烧瓶重定向(url_for)错误;nginx,python,nginx,flask,reverse-proxy,gunicorn,Python,Nginx,Flask,Reverse Proxy,Gunicorn,我的flask应用程序中的重定向(url_for)函数有问题 任何重定向(url_for(“index”)行都会将应用程序从domain.com/app重定向到ip addr/app,其中ip addr是我自己的客户端机器ip,而不是服务器的 这让我非常困惑,我不知道问题到底发生在哪里,因为它只发生在服务器上,而不发生在任何本地测试上 详细信息: 我正在使用此处找到的反向代理设置。 我的nginx配置是这样设置的 location /app { proxy_set
location /app {
proxy_set_header X-Script-Name /app;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Host $proxy_add_x_forwarded_for;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_connect_timeout 60;
proxy_read_timeout 60;
proxy_pass http://localhost:8000/;
}
我让gunicorn将我的flask应用程序作为一项新任务运行。
有什么提示吗
编辑:
所以我仔细研究了一下,发现这个git报告也有类似的问题
Nginx-通过本地主机向Nginx提供服务的Gunicorn(127.0.0.1:1234)。不幸的是,当我使用社交平台进行身份验证时,social auth将它们发送到的重定向URL为127.0.0.1:1234/twitter/complete,这显然无法通过客户端浏览器解决
我的Flask应用程序似乎没有收到更新其重定向路由的备忘录。我找到了解决方案。我必须使用
重定向(url\u for(location,\u external=True))
来进行所有重定向
(x,\u external=True)的url\u似乎将使用我的nginx代理集\u头中的所有变量来构造url,而(x)
的url\u却没有这样做
这适用于服务器和本地开发。也有同样的问题。您的解决方案是,通过将应用程序设置为每个环境的配置变量,使应用程序有必要知道它正在运行哪个域。我发现解决方案实际上是重写nginx proxy_pass上的头,如下所示:
location /api {
# Define the location of the proxy server to send the request to
proxy_pass http://web:8000;
# Redefine the header fields that NGINX sends to the upstream server
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# Define the maximum file size on file uploads
client_max_body_size 5M;
}
我在这件事上损失了两个晚上,我终于用这个解决方案解决了它:,我的代理设置:
ProxyPass /crm http://localhost:5013/
ProxyPassReverse /crm http://localhost:5013/
ReverseProxy类工作得很好,诀窍是“script_name”,它最初没有包含在这里的代码片段中:我想从flask页面剪下的代码可以与ngnix一起使用,这是针对apache2代理的。如果有人带着同样的问题(包括未来的我)再次来到这里,希望这会有所帮助。添加包括代理参数
为我修复了它
location / {
proxy_pass http://...;
include proxy_params;
}
我也有类似的问题。当我使用gunicorn运行它时,我的服务器在@return redirect(url_代表('login'))处崩溃。
有关解决方案,请转到在编辑块中添加更多详细信息。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能无效。-没错。编辑了我的答案。谢谢。我改回原来的答案,因为我刚发现stackoverflow不喜欢两个地方的答案相同。这或多或少是正确的。看起来这个问题可能应该被标记为重复。但是,在我的专业领域之外。这个答案+1,因为它解决了出现问题的地方(nginx代理)。公认的答案更多的是一种解决办法。但是,如果使用plesk(或其他虚拟化),则默认位置将不存在代理参数/etc/nginx/proxy\u params
。要么设置正确的路径,要么像@Mauricio的回答那样手动设置