部署在Railway的Django后端通过Cloudflare访问出现无限重定向求助
解决Django后端通过Cloudflare访问时的无限重定向循环问题
一、核心配置调整(settings.py + Cloudflare)
1. Django settings.py 修正
当前配置未完全适配Cloudflare+Railway的代理环境,替换为以下配置:
# 识别Cloudflare/Railway传递的HTTPS协议头 SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') # 允许自定义域名和Railway后端域名 ALLOWED_HOSTS = ['myproject.com', 'your-railway-backend-domain.railway.app'] # 开启HTTPS重定向(配合代理头使用,避免循环) SECURE_SSL_REDIRECT = True # 启用代理传递的主机和端口信息 USE_X_FORWARDED_HOST = True USE_X_FORWARDED_PORT = True # 确保Cookie仅通过HTTPS传输 SESSION_COOKIE_SECURE = True CSRF_COOKIE_SECURE = True
注意:替换
your-railway-backend-domain.railway.app为实际的Railway后端域名;若仍有循环,可临时将SECURE_SSL_REDIRECT设为False,排查其他原因。
2. Cloudflare 配置调整
- SSL/TLS模式切换:
- 先在Railway服务中绑定自定义域名
myproject.com,Railway会自动生成SSL证书 - 将Cloudflare的SSL/TLS模式改为Full(不要用Strict,除非你自行上传了SSL证书到Railway)
- 先在Railway服务中绑定自定义域名
- 关闭冲突规则:
- 进入Cloudflare的「网络」设置,关闭「自动HTTPS重定向」
- 检查「页面规则」,若存在强制HTTP转HTTPS的规则,暂时禁用
二、后端代码检查点
- URL重定向逻辑:
- 排查所有视图函数中的重定向代码,禁止硬编码HTTP域名(如
redirect('http://myproject.com')),改用反向解析reverse()或相对路径(如redirect('/'))
- 排查所有视图函数中的重定向代码,禁止硬编码HTTP域名(如
- 自定义中间件:
- 检查是否有中间件在判断
request.is_secure()时强制跳转,若Django未正确识别HTTPS,会导致无限循环
- 检查是否有中间件在判断
- 第三方应用配置:
- 若使用django-allauth等第三方库,确保相关HTTPS配置正确(如
ACCOUNT_DEFAULT_HTTP_PROTOCOL = 'https')
- 若使用django-allauth等第三方库,确保相关HTTPS配置正确(如
- Railway服务配置:
- 确认Railway服务映射的端口与Django运行端口一致(默认8000)
- 检查环境变量是否正确设置
DJANGO_SETTINGS_MODULE
三、调试验证
- 执行
curl -v https://myproject.com,查看响应头中的location字段,确认重定向目标是否异常 - 在Django视图中打印
request.META['HTTP_X_FORWARDED_PROTO'],验证是否为https - 临时暂停Cloudflare的缓存功能,测试是否仍存在循环
内容的提问来源于stack exchange,提问作者Joshua Singla
相关产品推荐
相关产品推荐

