307 在 Chrome 中加载 analytics.js 时重定向

307 Redirect when loading analytics.js in Chrome

我正在构建一个网络应用程序并使用 Google Analytics (analytics.js) 进行分析。我最近注意到 Chrome.

中的分析无法正常工作

我正在使用单独模块中的标准代码片段加载分析,并通过 requirejs 包含在内。我已验证此脚本 运行 符合预期并执行分析片段。

当我在 Firefox 中检查网络流量时,我可以看到分析脚本按预期从 Google 加载(HTTP 200 响应):

但是,当我 运行 Chrome 中的完全相同的页面时,我收到指向 about:blank 的 HTTP 307 响应,而分析没有 运行:

但是,如果我将分析 URL 直接粘贴到 Chrome 地址栏,就会找到脚本。知道这里发生了什么,或者如何解决它吗?

307 Internal RedirectNon-Authorative-Reason: Delegate 表示请求被 Chrome 扩展通过 webRequest or declarative webRequest 扩展 API 拦截和修改(重定向)。

您可以通过以下方式找出触发重定向的扩展程序:

  1. 访问chrome://net-internals/#events
  2. 触发请求(google 分析,在你的情况下)。
  3. 返回 chrome://net-internals/#events 选项卡并查找 URL_REQUEST 匹配您的请求(您可以使用搜索框过滤搜索)。
  4. 单击条目以在右侧显示日志。你会看到请求的扩展名、扩展ID等信息:
t=7910 [st=0] +REQUEST_ALIVE  [dt=6]
t=7910 [st=0]   +URL_REQUEST_DELEGATE  [dt=5]
t=7910 [st=0]      DELEGATE_INFO  [dt=5]
                   --> delegate_info = "extension [Name of extension]"
t=7915 [st=5]      CHROME_EXTENSION_REDIRECTED_REQUEST
                   --> extension_id = "ebmlimjkpnhckbaejoagnjlgcdhdnjlb"
t=7915 [st=5]   -URL_REQUEST_DELEGATE
t=7915 [st=5]   +URL_REQUEST_START_JOB  [dt=1]
                 --> load_flags = 339804160 (BYPASS_DATA_REDUCTION_PROXY | MAYBE_USER_GESTURE | REPORT_RAW_HEADERS | VERIFY_EV_CERT)
                 --> method = "GET"
                 --> priority = "LOW"
                 --> url = "https://www.google-analytics.com/analytics.js"
t=7915 [st=5]      URL_REQUEST_REDIRECT_JOB
                   --> reason = "Delegate"
t=7915 [st=5]      URL_REQUEST_FAKE_RESPONSE_HEADERS_CREATED
                   --> HTTP/1.1 307 Internal Redirect
                       Location: about:blank
                       Non-Authoritative-Reason: Delegate

在此日志示例中,名称为“[扩展名]”且扩展 ID "ebmlimjkpnhckbaejoagnjlgcdhdnjlb" 的扩展重定向了请求。找到扩展名and/or ID后,可以访问chrome://extensions,禁用或删除修改请求的扩展。

就我而言,307 重定向的原因更为平淡无奇。出于使用 protocol-relative URLs 的习惯,我在 Google Universal Analytics 的嵌入脚本中删除了 URL 的协议,将 https://www.google-analytics.com/analytics.js 更改为 //www.google-analytics.com/analytics.js .

例如(不要在家尝试这个):

(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

这是不可取的,因为 Google 显然仅通过 https 提供脚本和跟踪请求。因此,在首次嵌入脚本时以及在任何(!)后续跟踪请求中,删除协议都会导致重定向。此外,正如 Paul Irish 在其 canonical post about protocol-relative URLs 的更新中所述,此技术不再受到鼓励或确实具有优点:

Now that SSL is encouraged for everyone and doesn’t have performance concerns, this technique is now an anti-pattern. If the asset you need is available on SSL, then always use the https:// asset.

就我而言,我在浏览器上激活了 UBlock Origin。一旦断开连接或网站获得授权,内部重定向就会停止