用于检测 Google Chrome 的预加载请求的 HTTP 标头

Posted

技术标签:

【中文标题】用于检测 Google Chrome 的预加载请求的 HTTP 标头【英文标题】:HTTP header to detect a preload request by Google Chrome 【发布时间】:2012-04-08 18:48:39 【问题描述】:

Google Chrome 17 引入了一个新的 feature,它会在实际发出请求时预加载网页以提高渲染速度(在多功能栏中按 Enter)。

两个问题: 是否有一个 HTTP 标头来检测服务器端的此类请求,如果确实存在,那么正确的响应是什么以防止此类预加载(以防止可能产生不良影响的意外请求)?

谷歌浏览器在发出预加载请求之前会检查 robots.txt 吗? 是否有仅针对此特定行为的 robots.txt 设置? (我想/希望不允许已经有效)。

是否有元标记通知谷歌浏览器不再在当前域上预加载?

【问题讨论】:

【参考方案1】:

Chrome 在 2011 年停止发送 X-Purpose 标头,他们表示不会在那里修复它:https://code.google.com/p/chromium/issues/detail?id=86175。

他们在 2018 年重新引入了带有所有 nostate-prefetch 请求的发送 Purpose:prefetch 标头,如对此问题的最后评论所述。 https://bugs.chromium.org/p/chromium/issues/detail?id=86175#c65

【讨论】:

【参考方案2】:

当 Firefox 预取内容时(根据引用页面的要求 标记),它会随请求发送以下标头:X-moz: 预取

Safari 的做法类似,使用:X-Purpose:预览。根据这个 票,Chrome 也是。

对于预渲染,Chrome 不会向 客户。相反,必须在 JS 中使用 Page Visibility API

source, additional reading

【讨论】:

强调:“当预渲染发生时,Chrome 不会传递任何有区别的标题”,这几乎回答了我的问题。根本不使用预取 HTTP 标头(请求正文时)。 我认为需要明确一点,预渲染和预取不是一回事。预取在主要浏览器中默认是开启的,并且总是由一个特殊的标头(Chrome 中的X-Purpose: preview)指示。预渲染是一项实验性的 Chrome 功能,开发人员必须选择加入。没有标头来检测预渲染,因为开发人员知道他们是否打开了它。 @krispy - 实际上,即使开发人员没有选择加入(例如,当用户在 url 栏中输入时),预渲染也会发生。这对我们来说是一个讨厌的错误的原因。检测此 AFAIK 的唯一方法是通过页面可见性 API,因此无法在服务器端检测到它。在这种情况下,IMO 他们真的应该设置一个 http 标头(他们没有这样做)。 @UpTheCreek 自从我发布后,预渲染的选择加入性质可能已经改变。也就是说,我相信预渲染只能通过 GET 请求发生。因此,可以通过遵循 HTTP 标准并且不执行 GET 请求的结果来避免 Chrome 预取 API 调用导致的错误。 GET 请求仅用于获取数据。 POST、PUT 和 DELETE 用于其他操作。请注意,我并不是说您的错误与此有任何关系。我只是为了那些在构建 API 时可能会遇到这个问题的人而提到它。 @krispy:获取数据会消耗资源,如果请求格式不正确(例如错误的查询字符串),可能会导致在服务器端生成错误消息。自动执行此操作并且绝对无法指示它是可笑的。这也是对 Chrome 用户带宽的严重滥用。

以上是关于用于检测 Google Chrome 的预加载请求的 HTTP 标头的主要内容,如果未能解决你的问题,请参考以下文章

加载Pytorch中的预训练模型及部分结构的导入

加载Pytorch中的预训练模型及部分结构的导入

Google Cast:检测无法加载的 QueueItem

Google chrome 出现WEbGL遇到问题

chrome 浏览器的预提取资源机制导致的一个请求发送两次的问题以及ClientAbortException异常

给Chrome“捉虫”16000个,Google开源bug自检工具