在Nginx反向代理后面处理烧瓶url_for

时间:2019-10-30 20:16:45

标签: nginx flask flask-login

我有一个烧瓶应用程序,它使用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

2 个答案:

答案 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)。

https://werkzeug.palletsprojects.com/en/0.15.x/middleware/proxy_fix/#module-werkzeug.middleware.proxy_fix

这应该可以使url_for正常工作。