2013-11-15 27 views
2

Django的PREPEND_WWW加上常見中間件自動將所有根域流量重定向到「www」。域。我如何最好地實現相反?在Django下? Apache的? Ngnix?實現PREPEND_WWW相反的最佳方式(例如,從「www」重定向到根域)?

+0

你會想在django之外做到這一點。 [Nginx](http://stackoverflow.com/a/7958540/766952)和[Apache](http://stackoverflow.com/a/1100363/766952)的說明。 – DanielB

+0

有關完整答案:爲什麼在django之外?除了root-> wwww,還有什麼關於www-> root? – Bryce

+0

爲了節省自己打django的開銷。你必須事先打nginx/apache,他們可以提供請求,而不必讓django處理請求/響應。 – DanielB

回答

3

哪裏可能,你會想在django之外做這種重定向。這裏是關於NginxApache的說明。 (您需要根據需要調整配置non-wwwwww)。

至於爲什麼要在django之外做,答案就是性能。這裏沒有必要讓django處理請求和響應,因爲它可以在請求生命週期的早期完成。這意味着您可以保存您的django進程,以便在實際需要時使用它們。

當您無法訪問服務器配置(例如某些共享主機環境)時,您應該使用PREPEND_WWW或類似custom middleware的唯一原因。它被用作最後的手段。

+0

如何直接從Django,這是必要的? (在我的情況下,作爲網站的一部分必須使用www,部分不得使用www)。 – Bryce

+0

它仍然可能在apache上使用mod_rewrite或nginx使用'location'指令。爲什麼part *有*使用www雖然? – DanielB

+0

該網站的一部分是遺留內容,必須保留入站鏈接。該網站的其餘部分是有光澤的和新的,並且所選的約定是根域。但我也在這裏找到答案的所有選項。 – Bryce

1

由於@DanielB在Django之外執行此操作會更好。但是,如果你想在Django中做到這一點(例如你想學習,或者你不關心性能,或者你想測試你的測試服務器是否使用Apache,或者其他什麼),那麼你可以使用這個代碼,我發現here

class RemoveWwwMiddleware(): 
    def process_request(self, request): 
     try: 
      if request.META['HTTP_HOST'].lower().find('www.') == 0: 
       from django.http import HttpResponsePermanentRedirect 
       return HttpResponsePermanentRedirect(request.build_absolute_uri().replace('//www.', '//')) 
     except: 
      pass 
相關問題