Python gunricorn+的烧瓶重定向(url_for)错误;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

我的flask应用程序中的重定向(url_for)函数有问题

任何重定向(url_for(“index”)行都会将应用程序从domain.com/app重定向到ip addr/app,其中ip addr是我自己的客户端机器ip,而不是服务器的

这让我非常困惑,我不知道问题到底发生在哪里,因为它只发生在服务器上,而不发生在任何本地测试上

详细信息:

我正在使用此处找到的反向代理设置。 我的nginx配置是这样设置的

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的回答那样手动设置