Heroku上的Django SSL重定向:“重定向过多”

时间:2019-04-17 11:32:35

标签: python django heroku https

我有一个使用自定义域名部署到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

4 个答案:

答案 0 :(得分:3)

据我了解,“ Cloudflare”是它使用代理来使您的网站更快。如果启用了代理,则与heroku结合使用会导致“重定向过多”。

enter image description here

确保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'

来自Django documentation

  

请注意,标头必须采用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