繁体   English   中英

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

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM