2017-01-22 62 views
0

運行在負載均衡器後面的Django網站,它通過在/ health /使用實例的IP地址而不是域名發出HTTP GET請求來執行健康檢查。django:使用ip地址代替域名時禁用PREPEND_WWW

我使用PREPEND_WWW將www添加到域名如果丟失。

但是PREPEND_WWW也將www添加到IP地址,這顯然是錯誤的。例如http://www.123.123.123.123/health/

有沒有辦法阻止添加www的IP地址,或者也許只有當正則表達式列表匹配時才添加www的匹配?

或者我應該避免使用PREPEND_WWW並使用自定義視圖/重定向手動實現重定向?

請注意我也使用SECURE_SSL_REDIRECT = True,以防萬一也會影響www重定向。


以供將來參考,我使用Apache在Ubuntu的mod_wsgi,所以我的「服務器級別」的解決方案是使用mod_rewrite。

# Edit vhost configuration 
sudo vi /etc/apache2/sites-enabled/000-default.conf 

# Add redirection to VirtualHost block 
<VirtualHost *:80> 
    ... 
    RewriteEngine On 
    RewriteCond %{HTTP_HOST} ^domain.com$ 
    RewriteRule (.*) https://www.domain.com$1 [R=301,L] 
    ... 

# Enable mod_rewrite and restart 
sudo a2enmod rewrite && sudo service apache2 restart 
+2

我想說這應該在生產中的nginx(或其他Web服務器)級別完成。 – makaveli

回答

1

一般來說,PREPEND_WWW是一個較少使用的設置,因爲它是越野車 - 它不會對主機名的別名,IP地址,甚至本地主機正常工作。 這是Django上的一個已知問題,看起來好像不會被修復。 以下是relevant ticket的詳細信息

就像@makaveli指出的那樣,nginx或任何其他可能使用的web服務器代理將是正確的重定向位置。

但是,如果您絕對必須在代碼中執行此操作,請單擊此處: 您可以做的一件事是編寫自己的custom middleware which is derived from CommonMiddleware,它覆蓋process_request

例如,

must_prepend = settings.PREPEND_WWW and host and not host.startswith('www.') 
    redirect_url = ('%s://www.%s' % (request.scheme, host)) if must_prepend else '' 

可能是(僞)

must_prepend = False 
ip_address_regex = .... 
if settings.PREPEND_WWW: 
    must_prepend = host and not re.match(ip_address_regex, host) and not host.startswith('www.') 
redirect_url = ('%s://www.%s' % (request.scheme, host)) if must_prepend else '' 

當然,這需要很好地測試了,這將是你的責任,更新此中間件作爲CommonMiddleware實施變更。

+0

謝謝。我猜想,python/django解決方案將會覆蓋process_request,而您的示例對了解如何工作會很有幫助。但是,我會按照建議並在服務器級別執行重定向。 – python1981

相關問題