Rails 7部署Heroku生产环境后realdomain.com的Turbolinks失效问题
环境配置
- Rails 7 应用,通过sprockets加载/编译Turbolinks
- 本地开发环境:localhost
- Heroku预发布环境:appstaging.herokuapp.com
- Heroku生产环境(语言1):appprod1.herokuapp.com + realdomain.com
- Heroku生产环境(语言2):appprod2.herokuapp.com + realdomain.es
realdomain.com和realdomain.es均通过Cloudflare访问
问题现象
Turbolinks在以下场景均正常工作:
- 本地开发环境
- Heroku预发布环境
- 通过appprod1.herokuapp.com、appprod2.herokuapp.com访问生产环境
- 通过realdomain.es访问生产环境
但通过realdomain.com访问时,Turbolinks完全失效(已在多客户端/设备验证):
- 浏览器开发者工具确认application.js已正确加载Turbolinks代码
- 点击链接时采用HTTP全页加载而非XHR请求
turbolinks:load事件未触发- 其他JS功能运行正常
排查与修复方案
1. 对比Cloudflare配置差异
重点检查realdomain.com与realdomain.es的Cloudflare配置区别:
- 缓存/页面规则:确认realdomain.com是否开启HTML缓存、自动优化类规则,这类规则可能篡改页面内容或响应头,导致Turbolinks异常。临时禁用相关规则测试。
- Rocket Loader:该功能会延迟加载JS,可能打乱Turbolinks初始化顺序。检查realdomain.com是否开启此功能,临时关闭验证。
- 响应头对比:查看两个域名返回的
Content-Type、Cache-Control等头信息,确保realdomain.com的HTML响应头为text/html; charset=utf-8,无异常缓存指令。
2. 验证Turbolinks初始化状态
在realdomain.com页面的开发者工具控制台执行以下命令,确认Turbolinks是否正常初始化:
Turbolinks.supported // 预期返回true Turbolinks.controller // 预期返回Turbolinks.Controller实例
若返回异常,排查页面中是否有其他JS代码篡改window.Turbolinks或干扰DOM事件绑定。
3. 检查链接与Turbolinks触发条件
确认realdomain.com的页面链接符合Turbolinks触发要求:
- 链接为同域地址,未添加
data-turbolinks="false"属性 - 在控制台执行
Turbolinks.visit('/目标路径'),观察是否触发XHR加载 - 核对
turbolinks-railsgem版本与前端Turbolinks版本是否匹配,避免版本兼容问题
4. 检查Heroku域名与应用配置
- 确认realdomain.com在Heroku的域名绑定是否正确,是否存在重定向规则(如HTTP转HTTPS)导致Turbolinks无法追踪页面状态,临时禁用重定向测试。
- 检查
config/environments/production.rb中是否针对realdomain.com有特殊的JS压缩或资源加载配置,确认未因压缩规则破坏Turbolinks代码。
5. 排除客户端缓存影响
使用浏览器无痕模式访问realdomain.com,或强制刷新页面(Ctrl+Shift+R),排除客户端缓存残留的旧代码干扰。
内容的提问来源于stack exchange,提问作者user2148956
相关产品推荐
相关产品推荐

