部署在Heroku的Rails应用对外为HTTPS但日志打印request.base_url显示HTTP原因
问题根因
- Heroku平台的入口内置了反向代理和负载均衡层,所有外部HTTPS请求的TLS解密(SSL终止)操作都在这一层完成
- 代理层与你的Rails应用实例之间走内网HTTP协议通信,所以Rails服务直接收到的原始请求本身就是HTTP协议,默认输出的
request.base_url自然为HTTP前缀 - Rails默认不会主动识别代理传递的
X-Forwarded-Proto(标识外层真实请求协议)请求头,无法感知到外部真实请求的HTTPS协议
修复方法
你可以通过两步配置解决这个问题,所有配置都在Rails项目的config/environments/production.rb文件中修改:
- 配置Rails信任Heroku的内部代理,允许读取代理传递的协议标识头:
# 匹配Heroku内部代理的10段内网IP,Rails会信任这些代理传递的请求头 config.action_dispatch.trusted_proxies = /^10\./ # Rails 6及以上版本还需要添加你的域名到信任列表 config.hosts << "example.sample.com"
- 开启Rails强制SSL配置:
config.force_ssl = true
开启后Rails会自动根据X-Forwarded-Proto头识别外层真实协议,生成的request.base_url、应用内的所有链接都会自动带HTTPS前缀,同时会自动把HTTP请求跳转到HTTPS地址。
内容的提问来源于stack exchange,提问作者Emmanu
相关产品推荐
相关产品推荐

