[英]Django SSL redirection on Heroku: 'Too many redirects'
我有一個使用自定義域名部署到Heroku的Web應用程序,該域名通過CloudFlare管理。
我要做的是將HTTP請求重定向到HTTPS 。
根據Django的文檔 ,將SECURE_SSL_REDIRECT
設置為True之后,在通過自定義域訪問網站時,我遇到了Too many redirects
(或site redirected you too many times
)錯誤。
這是我的settings.py
文件中的內容:
SECURE_SSL_REDIRECT = True
SECURE_PROXY_SSL_HEADER = ('X-Forwarded-Proto', 'https')
請注意,此重定向適用於myapp.herokuapp.com
域。
我在CloudFlare上使用DNS +代理,並且根據Heroku的文檔設置了SECURE_PROXY_SSL_HEADER
。
這是Heroku日志:
2019-04-17T11:21:08.514202+00:00 heroku[router]: at=info method=GET path="/" host=staging.mywebsite.com request_id=cf90ab0c-0895-4faf-aeea-5ee5fe5f970d fwd="115.87.132.194,172.68.242.176" dyno=web.1 connect=0ms service=2ms status=301 bytes=228 protocol=http
據我了解,“ Cloudflare”是它使用代理來使您的網站更快。 如果啟用了代理,則與heroku結合使用將導致“重定向過多”。
確保Cloudflare DNS中的雲未設置為橙色,並且在服務器之前不會使用代理。
您可以在heroku中設置SSL,請參見: https ://devcenter.heroku.com/articles/ssl-endpoint
Django修改了標頭的格式,因此“ X-Forwarded-Proto”變為“ HTTP_X_FORWARDED_PROTO”,因此在示例中,您應將'X-Forwarded-Proto'
替換為'HTTP_X_FORWARDED_PROTO'
。
從Django文檔中 :
請注意,標頭必須采用request.META所使用的格式-全部為大寫,可能以HTTP_開頭。 (請記住,在將標頭在request.META中可用之前,Django會自動在x標頭名稱的開頭添加“ HTTP_”。)
此確切的標頭也有一個示例。
設置一個包含兩個元素的元組-要查找的標頭名稱和所需的值。 例如:
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
這告訴Django信任來自我們代理的X-Forwarded-Proto標頭,並且只要其值是'https',就可以保證請求是安全的(即,它最初是通過HTTPS傳入的)。
Django文檔中有關於SECURE_SSL_REDIRECT
注釋,指出:
如果將其設置為
True
會導致無限重定向,則可能意味着您的網站在代理后面運行,並且無法確定哪些請求是安全的,哪些不是安全的。 您的代理可能會設置標頭以指示安全請求; 您可以通過找出該標頭是什么並相應地配置SECURE_PROXY_SSL_HEADER
設置來糾正問題。
在嘗試了多種方法並始終收到“ Too Many Redirects”錯誤之后,我只是決定從CloudFlare進行所有重定向,並將其從我的Django App中刪除。
這是文檔 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.