什么情况下 HTTP referer 会被截断

In what cases HTTP referer will be truncated

我正在尝试了解 HTTP 引荐来源网址的行为 header。我注意到有时引荐来源网址已满(完整 URL,包括路径和查询字符串)但大多数情况下它仅包含域。

例如'https://www.google.com/' instead of 'https://www.google.com/search?q=http+referer+truncated&oq=http+referer+truncated&aqs=chrome..69i57.6485j0j1&sourceid=chrome&ie=UTF-8#q=http+referer+is+not+full'

是否有关于 refer 和何时已满以及何时被截断的规则?

HTTP referrer headers 由浏览器根据所需标准使用 Referrer Policy 创建,尽管大多数浏览器都使用通用标准,但浏览器处理方式存在一些差异服务器指令,主要是移动网络浏览器,在这个问题上不能很好地配合 WWWC 的建议。

那么为什么需要不同的 HTTP 引荐来源网址 header?要理解这一点,我们需要首先了解这些 header 的用途。最简单形式的主要目的是 "carrying information from the originating page to the new page".

我们在网络上看到 "information" 这个词的任何地方都附带了一个信息安全概念,HTTP header 也不例外。根据 header 携带的信息类型,服务器可以指定需要使用的引用策略类型。这是来自 W3

的引荐政策列表

enum ReferrerPolicy { "", "no-referrer", "no-referrer-when-downgrade", "same-origin", "origin", "strict-origin", "origin-when-cross-origin", "strict-origin-when-cross-origin", "unsafe-url" };

关于这些的详细信息可以在我上面包含的推荐人政策link中找到。

举个例子; 使用 google 搜索 "Yellow Pages"。在这种情况下

来源:https://www.google.ie

推荐人:https://www.google.ie/

推荐人Policy:origin

生成URL:https://www.google.ie/gen_204?atyp=i&ct=&cad=udla=3&ei=x65kGDkdyKGHDkF0KeoBg&e=12&zx=1494785478502

link到第一个结果是

https://www.google.ie/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwiA26TfiHSGDFHKFAKHQXoCWUQFggoMBB&url=https%3A%2F%2Fwww.goldenpages.ie%2F&usg=AFQjCNGTG-tsBSFHgMkXw_GuvOcLEOD2hg

而实际的 URL 是 https://www.goldenpages.ie/

当我们实际点击时 link referrer 变为

推荐人:https://www.goldenpages.ie/ 并且推荐人政策是

推荐人 Policy:no-referrer-when-downgrade

这意味着,如果我们从当前页面单击另一个 link,我们将不会看到与我们在 google 搜索结果的 URL 中看到的参数类似的所有其他参数页。

证明是这样;单击当前页面中的任何 link 并观察引荐来源网址 header 根据政策类型的变化(如果您使用开发人员工具并检查网络,可以在关联的 js 文件中找到它 activity)

当我点击 "List your business" link 引荐来源时保持

https://www.goldenpages.ie/list-your-business/

并且没有传递其他参数

所以只是为了整理这个乱七八糟的解释; URL 生成的内容取决于针对引荐来源策略设置的规则可能是一个没有参数的简单基本规则,或者是一个非常长的 URL,其中包含与用户和来源相关的大量信息导航。

注意:URL我打乱了一些字母,无法正常工作。

同时存在 Referrer-Policy header 和 referrer 元标记。

<meta name="referrer" content="none">

他们似乎做的工作完全一样(如@Ulug 的回答所述)。如果两者都存在,我不知道浏览器如何决定选择哪个,我只是删除了 HTML 一个来解决我的问题。

截至 2020 年 11 月的更新详情...

许多浏览器在发出跨域请求时开始默认使用更严格的引用策略 (strict-origin-when-cross-origin),而不是旧的默认值 (no-referrer-when-downgrade)。这通常会导致 url 被截断,但偶尔也意味着根本不会设置引荐来源网址 (no-referrer)。

这是一篇关于此的好文章的摘录: https://plausible.io/blog/referrer-policy

Chrome is using strict-origin-when-cross-origin from version 85. Strict-origin-when-cross-origin is where the full path is sent if on the same domain but only sends the domain itself if going to another domain. Previously it used no-referrer-when-downgrade.

Firefox is using no-referrer-when-downgrade by default. It always passes the full path unless the request is sent from HTTPS to HTTP. Firefox is using strict-origin-when-cross-origin in the Private Browsing tabs and for known trackers.

Edge is using no-referrer-when-downgrade. Same as Firefox.

Safari is using strict-origin-when-cross-origin. Same as Chrome.

Brave is using no-referrer where the referrer header is completely removed. It never shares the full URL even for same-origin requests and you cannot even see the domain name for cross-origin requests.