2014-09-21 104 views
3

我正在将apache2和mod_wsgi环境中的Flask应用程序移动到Nginx,并且在使url正常工作时遇到问题。在非域根URL上运行Flask应用程序

我想我的应用程序的根页面出现在,例如,http://example.org/myapp/

我@ app.route装饰是如@app.route('/')为我的应用程序的根(http://example.org/myapp)和@app.route('/subpage')为像http://example.org/myapp/subpage的子页面。

在apache下,这个所有的“刚刚工作”,我拨打url_for()产生的URLS完成了工作。现在

url_for()我的网址的格式为:href="/subpage",这是送我到域根的http://example.org/subpage而不是我想要的东西:href="./subpage",这将使我http://example.org/myapp/subpage

对于它的价值,从我的Nginx的配置相关的部分是:

location /myapp/ { 
     proxy_redirect  off; 
     proxy_set_header Host $host; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header X-Forwarded-Host $server_name; 
     proxy_pass   http://127.0.0.1:8001/; 
    } 

我服务与gunicorn应用。

就目前情况而言,访问http://example.org/myapp/会将我带到我的Flask应用程序的根页面,但所有其他URL都会将我带回域级别:http://example.org/subpage

我曾尝试将APPLICATION_ROOT设置为“/ myapp”,但似乎没有效果。我在做什么(可怕的)错误?

回答

5

的(或至少一个)解决方案,可以在这个片段中找到:http://flask.pocoo.org/snippets/35/

我仍然感到惊讶并没有什么更优雅,但这对于现在要做的。

+0

myapp/root是否在apche2中为您工作,因为我已经使用了它,并且我还必须使用该代码段来获取u rl_for在我的apache2中正常工作? – tonka 2015-05-14 08:39:02

0

我知道这是一个老问题,但我有同样的问题,我想要比EricD的答案更好的东西。

的解决方案是使用_external标志url_for并设置当代理传递到包括路径的其余部分HOST头:使用

所以在你烧瓶应用程序生成的URL

url_for('index', _external=True) 

而且在您的nginx配置中执行以下操作:

location /myapp/ { 
    ... 
    proxy_set_header Host $host/myapp; 
    ... 
} 
相关问题