You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部署在Heroku上的Rails 6项目出现重复GET请求问题求助

Rails 6 Heroku部署环境锚点链接重复请求问题排查

问题概述

部署在Heroku的Rails 6项目中,点击带锚点的超链接时会触发重复GET请求,导致控制器被两次调用,生成重复日志。本地开发环境无此问题,仅在Heroku生产环境出现。

日志证据

以下是Heroku路由日志,可见同一请求路径被连续发起两次(请求ID不同):

caio-agiani in ~ via ⬢ v14.21.3 took 10m 37s ❯ heroku logs -a levante-web -t | grep 2804:7f0:b8c2:13f:8755:4a1e:74b8:x735,172.71.10.17          
2024-03-31T02:32:36.318790+00:00 heroku[router]: at=info method=GET path="/levante/search?query=caioagiani" host=app request_id=3e84b5d5-b478-41aa-b1e8-218838f37ca1 fwd="2804:7f0:b8c2:13f:8755:4a1e:74b8:x735,172.71.10.17" dyno=web.1 connect=0ms service=426ms status=200 bytes=12075 protocol=https
2024-03-31T02:32:57.648033+00:00 heroku[router]: at=info method=GET path="/levante/search?query=caioagiani" host=app request_id=f17c6635-3541-4153-8283-3811659ff00a fwd="2804:7f0:b8c2:13f:8755:4a1e:74b8:x735,172.71.10.17" dyno=web.1 connect=0ms service=330ms status=200 bytes=12077 protocol=https
2024-03-31T02:33:01.813927+00:00 heroku[router]: at=info method=GET path="/levante/shop/index" host=app request_id=cc5dd643-41c3-45e9-bffa-a73ed617d0b0 fwd="2804:7f0:b8c2:13f:8755:4a1e:74b8:x735,172.71.10.17" dyno=web.1 connect=0ms service=42ms status=200 bytes=25575 protocol=https
2024-03-31T02:33:02.145246+00:00 heroku[router]: at=info method=GET path="/levante/shop/index" host=app request_id=7bdfadad-273e-4b8a-ab88-4f0422ececaf fwd="2804:7f0:b8c2:13f:8755:4a1e:74b8:x735,172.71.10.17" dyno=web.1 connect=0ms service=39ms status=200 bytes=25564 protocol=https

已知线索

  • 同配置的另一个生产项目,使用Rails原生标签(javascript_include_tag、javascript_pack_tag、stylesheet_pack_tag)加载静态资源,无此问题;当前项目使用简单HTML元标签加载,出现重复请求。
  • 怀疑问题与Turbolinks、Rails UJS或Service Worker相关。
  • 本地环境无负载均衡/Nginx配置,Heroku使用Node+Ruby Buildpack直接部署。

排查与解决方案

1. 验证Turbolinks初始化问题

Rails 6默认集成Turbolinks,若自定义元标签加载脚本导致Turbolinks未正确初始化,可能引发锚点导航的重复请求:

  • 切换回Rails原生的pack标签加载静态资源:在布局文件中使用javascript_pack_tag 'application'和stylesheet_pack_tag 'application',确保app/javascript/packs/application.js中正确导入Turbolinks:
    import "turbolinks"
    
  • 临时禁用单个锚点的Turbolinks处理:在链接上添加data-turbolinks="false"属性,测试是否还会出现重复请求。若问题消失,说明Turbolinks对锚点的处理逻辑存在冲突,可进一步调整Turbolinks配置(如设置Turbolinks.scrollToTop = false)。

2. 排查Rails UJS加载状态

Rails UJS负责拦截链接的默认行为,若未正确加载,可能导致浏览器默认跳转与Turbolinks请求同时触发:

  • 确保application.js中导入了Rails UJS:
    import "@rails/ujs"
    
  • 检查布局文件中是否通过原生标签加载了UJS,避免自定义脚本加载导致的初始化异常。

3. 排除Service Worker影响

若项目注册了Service Worker,生产环境的缓存策略可能误触发重复请求:

  • 临时注销Service Worker(注释注册代码),测试请求是否恢复正常。若问题消失,需调整Service Worker的fetch事件逻辑,避免对锚点链接发起重复请求。

4. 分析浏览器请求触发源

在生产环境打开浏览器开发者工具,查看网络请求的发起者:

  • 区分两次请求是由Turbolinks的AJAX请求、浏览器默认跳转还是其他自定义脚本触发,定位具体冲突点。

内容的提问来源于stack exchange,提问作者Caio Agiani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 16:17:15