我有一个使用自定义域名部署到Heroku的Web应用程序,DNS通过CloudFlare管理。
我想做的是将 HTTP 请求重定向到 HTTPS 。
根据Django's documentation,将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 +代理,并且SECURE_PROXY_SSL_HEADER
是根据Heroku的documentation设置的。
以下是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
答案 0 :(得分:3)
据我了解,“ Cloudflare”是它使用代理来使您的网站更快。如果启用了代理,则与heroku结合使用会导致“重定向过多”。
确保Cloudflare DNS中的云未设置为橙色,并且在服务器之前不会使用代理。
您可以在heroku中设置SSL,请参见: https://devcenter.heroku.com/articles/ssl-endpoint
答案 1 :(得分:3)
Django修改了标头的格式,因此“ X-Forwarded-Proto”变为“ HTTP_X_FORWARDED_PROTO”,因此在示例中应将'X-Forwarded-Proto'
替换为'HTTP_X_FORWARDED_PROTO'
。
请注意,标头必须采用request.META所使用的格式-全部为大写,可能以HTTP_开头。 (请记住,在将标头在request.META中可用之前,Django会自动在x标头名称的开头添加“ HTTP _”。)
还有一个确切的标题示例。
设置一个包含两个元素的元组–要查找的标头名称和所需的值。例如:
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
这告诉Django信任来自我们代理的X-Forwarded-Proto标头,并且只要它的值是'https',就可以保证请求是安全的(即,它最初是通过HTTPS传入的)。
答案 2 :(得分:0)
the Django documentation for SECURE_SSL_REDIRECT
中有一条注释指出:
如果将其转为
True
会导致无限重定向,则可能意味着您的网站在代理后面运行,无法分辨哪些请求是安全的,哪些不是安全的。您的代理可能会设置标头以指示安全请求;您可以通过找出标题是什么并相应配置SECURE_PROXY_SSL_HEADER
设置来纠正问题。
答案 3 :(得分:0)
尝试了多种方法并始终出现“ Too Many Redirects”错误之后,我只是决定从CloudFlare进行所有重定向,并将其从我的Django应用中删除。
这里是documentation。