2014-09-21 35 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; 
    ... 
} 
相關問題