[英]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.