我有一个烧瓶应用程序,它使用nginx进行反向代理/ ssl终止,但是在使用url_for和烧瓶中重定向时遇到了麻烦。
nginx.conf条目:
location /flaskapp {
proxy_pass http://myapp:8080/;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
这个想法是用户导航到
https://localhost:port/flaskapp/some/location/here
,并且应该以
的形式传递给烧瓶 http://localhost:8080/some/location/here
导航到已定义的路线时,此方法相当不错,但是,如果该路线具有redirect(url_for('another_page'))
,则浏览器将定向到
http://localhost:8080/another_page
并且失败了,当我实际要访问的URL是:
https://localhost:port/flaskapp/another_page
对于相似的情况,我尝试了其他几种答案,但似乎没有一个人在做我在这里所做的事情。我尝试使用_external=True
,设置app.config['APPLICATION_ROOT'] = '/flaskapp'
以及proxy_set_header
中的不同nginx.conf
命令的许多迭代,但是没有运气。
更复杂的是,我的flask应用程序正在使用flask-login
和CSRF cookie。当我尝试设置APPLICATION_ROOT
时,应用程序停止认为flask-login
设置的CSRF cookie有效,我认为这与来源有关。
所以我的问题是,如何使烧瓶在向客户端返回redirect()
时,nginx理解给它的URL需要写入flaskapp
?
答案 0 :(得分:0)
我设法进行了一些修复。
更改1.将/ flaskapp添加到我的flask应用程序中的路由。这样就无需进行URL重写,从而大大简化了工作。
更改2. nginx.conf更改。我在位置块中添加了logc以将HTTP请求重定向为https,新的conf:
location /flaskapp {
proxy_pass http://myapp:8080/;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# New configs below
proxy_set_header X-Real-IP $remoteaddr;
proxy_set_header X-Forwarded-Proto $scheme;
# Makes flask redirects use https, not http.
proxy_redirect http://$http_host/ https://$http_host/;
}
虽然我没有“解决”基于已知前缀引入条件重写的问题,但由于我只需要为该应用添加一个前缀,所以将其烘焙到路由中是可以接受的解决方案。
答案 1 :(得分:0)
在您的情况下,我认为正确的做法是使用werkzeug的ProxyFix中间件,并让您的nginx代理设置适当的必需标头(特别是X-Forwarded-Prefix)。
这应该可以使url_for正常工作。