我的烧瓶应用程序中的重定向(url_for)功能出现问题。
任何重定向(url_for(“index”))行都会将应用程序从 domain.com/app 重定向到 ip-addr / app < / em> ,其中 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服务。不幸的是,当我使用社交平台进行身份验证时,重定向URL social-auth将它们发送到127.0.0.1:1234/twitter/complete,这显然无法通过客户端的浏览器解析。
似乎我的Flask应用程序没有获取更新其重定向路由的备忘录。
答案 0 :(得分:10)
我找到了解决方案。我必须使用redirect(url_for(location, _external=True))
进行所有重定向。
似乎url_for(x, _external=True)
会将我的nginx proxy_set_header中的所有变量构建为url,而url_for(x)
不会这样做。
这适用于服务器和本地开发。
答案 1 :(得分:3)
添加include proxy_params
为我修复了该问题。
location / {
proxy_pass http://...;
include proxy_params;
}
答案 2 :(得分:1)
有同样的问题。您的解决方案使应用程序必须通过在每个环境的config var上设置它来了解它正在运行的域。我发现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 :(得分:0)
我已经失去了2个晚上,我终于使用这个解决方案解决了它: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类工作得很好,诀窍是&#34; script_name&#34;它最初没有包含在这里的代码段中:http://flask.pocoo.org/snippets/35/我想从烧瓶页面剪切的内容与ngnix一起使用,这适用于apache2代理。希望如果有人带着同样的问题再次来到这里(包括未来我),这会有所帮助
答案 4 :(得分:-1)
我有类似的问题。当我使用gunicorn运行服务器时,我的服务器在@return redirect(url_for('login'))崩溃。 有关解决方案,请转到Flask app running with gunicorn and nginx is crashing at redirecting point