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

mer*_*1er 2 python django https heroku

我有一个使用自定义域名部署到Heroku的Web应用程序,该域名通过CloudFlare管理。

我要做的是将HTTP请求重定向到HTTPS

SECURE_SSL_REDIRECT根据Django的文档,设置为True后,在通过自定义域访问网站时遇到了Too many redirects(或site redirected you too many times)错误。

这是我的settings.py档案中的内容:

SECURE_SSL_REDIRECT = True
SECURE_PROXY_SSL_HEADER = ('X-Forwarded-Proto', 'https')
Run Code Online (Sandbox Code Playgroud)

请注意,此重定向适用myapp.herokuapp.com域。

我在CloudFlare上使用DNS +代理,并且SECURE_PROXY_SSL_HEADER根据Heroku的文档进行设置

这是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
Run Code Online (Sandbox Code Playgroud)

小智 8

Django 修改了标头的格式,所以“X-Forwarded-Proto”变成了“HTTP_X_FORWARDED_PROTO”,所以你应该在你的例子中替换'X-Forwarded-Proto''HTTP_X_FORWARDED_PROTO'

Django 文档

请注意,标头需要采用 request.META 使用的格式 - 全部大写,并且可能以 HTTP_ 开头。(请记住,Django 会自动将 'HTTP_' 添加到 x-header 名称的开头,然后才能在 request.META 中提供标头。)

这个确切的标题还有一个例子。

设置一个包含两个元素的元组——要查找的标题的名称和所需的值。例如:

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
Run Code Online (Sandbox Code Playgroud)

这告诉 Django 信任来自我们代理的 X-Forwarded-Proto 标头,并且只要它的值为“https”,就保证请求是安全的(即,它最初是通过 HTTPS 传入的)。


小智 5

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

在此处输入图片说明

确保Cloudflare DNS中的云未设置为橙色,并且在服务器之前不会使用代理。

您可以在heroku中设置SSL,请参见:https ://devcenter.heroku.com/articles/ssl-endpoint