2013-05-21 62 views
4

我有一個Django應用程序,最近我需要啓動一個測試版本。我希望保持當前正在運行的應用程序不變,並在Nginx的幫助下將所有以「/ beta」開頭的請求重定向到測試版應用程序。這是我的conf如何在使用Nginx作爲代理服務器時正確處理重定向響應,django作爲後端

location/{ 
    proxy_pass_header Server; 
    proxy_set_header Host $http_host; 
    proxy_redirect off; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Scheme $scheme; 
    proxy_connect_timeout 10; 
    proxy_read_timeout 360; 
    proxy_pass http://localhost:8000/; 
} 

location /beta/ { 
    rewrite ^/beta/(.*)$ /$1 break; 
    proxy_pass_header Server; 
    proxy_set_header Host $http_host; 
    proxy_redirect off; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Scheme $scheme; 
    proxy_connect_timeout 10; 
    proxy_read_timeout 360; 
    proxy_pass http://localhost:8001/; 
} 

這工作,但有一個問題,當應用程序返回一個301響應,大多是當用戶需要登錄訪問某些資源的URL變成舊的。例如,/events需要登錄。

http://example.com/beta/events - >http://example.com/login?next=/events/

我怎麼能解決這個問題無需更改應用程序代碼? (Nginx解決方案?)

+0

你不應該在django後端/中間件而不是nginx中處理它嗎? – karthikr

+0

使用子域beta.example.com是一個更好的解決方案,對我來說 –

+0

我是否正確理解您正在使用Django的內置開發服務器作爲代理的後端?你真的不應該這樣做。如果你使用的是uwsgi,你的問題會有一個非常簡單的解決方案(並且你的應用會更快) –

回答

6

嘗試proxy_redirect

「該指令設置文本,必須在代理服務器響應中的響應頭」位置「和」刷新「中對其進行更改。

所以

proxy_redirect http://example.com/ http://example.com/beta/; 
當然

,這僅適用於重定向由代理服務器發出。我也假設所有重定向都有同樣的問題。提示:如有必要,您可以使用多個proxy_redirect指令。

+0

我與NGINX代理Tomcat的情況類似,NGINX使用SSL進行安全保護,將流量代理到Tomcat標準連接器(使用普通HTTP),Tomcat保持將流量重定向到網站的http:URL(儘管我將它重定向回到https:我想跳過額外的跳躍)。 這在這種情況下也很有魅力。我將proxy_redirecting從tomcat到https:對應的所有http:響應。美麗! –

相關問題