gunricorn + nginx 的烧瓶重定向(url_for)错误

Posted

技术标签:

【中文标题】gunricorn + nginx 的烧瓶重定向(url_for)错误【英文标题】:Flask redirect(url_for) error with gunricorn + nginx 【发布时间】:2014-04-14 06:07:59 【问题描述】:

我的烧瓶应用程序中的 redirect(url_for) 函数有问题。

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

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

详情:

我正在使用http://flask.pocoo.org/snippets/35/ 此处的反向代理设置。 我的 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 运行我的烧瓶应用程序作为新贵任务。 有什么提示吗?

编辑:

所以我挖了一下,发现这个 git 报告有类似的问题,https://github.com/omab/django-social-auth/issues/157。

Nginx - Gunicorn 通过 localhost (127.0.0.1:1234) 为 Nginx 服务。不幸的是,当我向社交平台进行身份验证时,social-auth 将它们发送到的重定向 URL 是 127.0.0.1:1234/twitter/complete,这显然无法被客户端的浏览器解析。

我的 Flask 应用似乎没有收到更新其重定向路由的备忘录。

【问题讨论】:

在编辑块中添加了更多细节。 【参考方案1】:

我找到了解决方案。我必须使用redirect(url_for(location, _external=True)) 进行所有重定向。

似乎url_for(x, _external=True) 将使用我的nginx proxy_set_header 中的所有变量来构造url,而url_for(x) 没有这样做。

这适用于服务器和本地开发。

【讨论】:

【参考方案2】:

遇到了同样的问题。您的解决方案是让应用程序有必要通过在每个环境的配置变量上设置它来了解它正在运行的域。我发现HERE 解决方案实际上是像这样重写 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;
   

【讨论】:

【参考方案3】:

我已经为此损失了两个晚上,我终于用这个解决方案解决了它:http://blog.macuyiko.com/post/2016/fixing-flask-url_for-when-behind-mod_proxy.html,我的代理设置:

ProxyPass /crm http://localhost:5013/
ProxyPassReverse /crm http://localhost:5013/

ReverseProxy 类运行良好,诀窍是它最初不包含在 sn-p 中的“script_name”:http://flask.pocoo.org/snippets/35/ 我猜从烧瓶页面截取的内容适用于 ngnix,这是用于 apache2 代理的。如果有人再次遇到同样的问题(包括未来的我),希望这会有所帮助

【讨论】:

【参考方案4】:

添加 include proxy_params 为我修复了它。

location / 
    proxy_pass http://...;
    include proxy_params;

【讨论】:

这个答案+1,因为它解决了它发生的问题(nginx代理)。接受的答案更多是烧瓶中的解决方法。但是,如果您使用 plesk(或其他虚拟化)proxy_params 将不存在于默认位置/etc/nginx/proxy_params。设置正确的路径,或者按照@Mauricio的答案手动设置【参考方案5】:

我有类似的问题。当我使用 gunicorn 运行它时,我的服务器在 @return redirect(url_for('login')) 处崩溃。 如需解决方案,请前往Flask app running with gunicorn and nginx is crashing at redirecting point

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review 确实如此。编辑了我的答案。谢谢。 我改回原来的答案,因为我刚刚发现 *** 在两个地方不喜欢相同的答案。 这或多或少是正确的。看起来这个问题可能应该被标记为重复。不过在我的专业领域之外。

以上是关于gunricorn + nginx 的烧瓶重定向(url_for)错误的主要内容,如果未能解决你的问题,请参考以下文章

从一个烧瓶应用程序重定向到本地主机上的另一个烧瓶应用程序[重复]

重定向后烧瓶闪存不起作用

在烧瓶中重定向时丢弃响应正文

重定向到不同的 URL 仅更改烧瓶中的域名

烧瓶如何在ajax调用后重定向到新页面[重复]

如果会话过期,如果没有活动并重定向登录页面,则烧瓶注销