一、referrerpolicy是什么?

当你在网页上点击一个链接跳转到另一个网站时,浏览器默认会告诉目标网站:"嘿,我是从某某页面过来的!"这个信息就是HTTP Referer(注意,虽然拼写是"Referer",但正确的英文应该是"Referrer",这是HTTP协议的历史遗留问题)。

但有时候,我们并不希望泄露来源信息,比如:

  • 从内部管理后台跳转到外部网站时,不希望暴露后台地址
  • 某些安全敏感页面不希望被第三方追踪来源
  • 需要减少请求头大小以优化性能

这时候,HTML的referrerpolicy属性就派上用场了!它可以精细控制浏览器发送的Referer信息。

二、referrerpolicy的取值及效果

这个属性支持多个值,每个值的行为略有不同:

<!-- 示例1:完全不发送Referer -->
<a href="https://example.com" referrerpolicy="no-referrer">安全跳转</a>

<!-- 示例2:只发送源站信息(不包含路径) -->
<img src="logo.png" referrerpolicy="origin">

<!-- 示例3:在同源情况下发送完整Referer -->
<script src="analytics.js" referrerpolicy="same-origin"></script>

具体可选值如下表:

行为描述
no-referrer 完全不发送Referer头
no-referrer-when-downgrade 默认值,HTTPS→HTTP时不发送
origin 只发送协议+域名(如https://example.com
origin-when-cross-origin 跨域时只发送origin,同源发送完整URL
same-origin 仅同源时发送完整Referer
strict-origin 只发送origin,且HTTPS→HTTP时不发送
strict-origin-when-cross-origin 跨域时发送origin,同源发送完整URL,且HTTPS→HTTP时不发送
unsafe-url 总是发送完整URL(即使HTTPS→HTTP)

三、实际应用示例

案例1:保护隐私的第三方链接

假设你的博客有很多外链,但不想让这些网站知道读者具体是从哪篇文章跳转的:

<!-- 技术栈:纯HTML -->
<p> 
  推荐阅读:
  <a href="https://external-site.com/article" 
     referrerpolicy="origin">
    外部优质文章
  </a>
</p>
<!-- 效果:只会发送"https://yourblog.com",不包含具体文章路径 -->

案例2:安全敏感操作

在银行网站中,从交易页面跳转到客服系统时应该限制Referer:

<!-- 技术栈:HTML + JavaScript -->
<button onclick="window.open('https://support.bank.com', '_blank', 'referrerpolicy=strict-origin')">
  联系客服
</button>
<!-- 效果:如果当前页是HTTPS则发送"https://bank.com",否则不发送 -->

案例3:CDN资源加载优化

使用CDN加载静态资源时,减少不必要的Referer信息可以节省带宽:

<!-- 技术栈:HTML -->
<link rel="stylesheet" 
      href="https://cdn.example.com/style.css"
      referrerpolicy="no-referrer-when-downgrade">
<!-- 默认行为,在HTTPS页面上加载HTTP资源时不发送Referer -->

四、注意事项与最佳实践

  1. 兼容性

    • 现代浏览器全面支持,但IE11及以下需要polyfill
    • 可以通过<meta name="referrer">设置全局策略
  2. 安全权衡

    • unsafe-url可能泄露敏感信息
    • strict-origin-when-cross-origin是推荐的安全默认值
  3. 性能影响

    • 减少Referer信息可以降低请求头大小
    • 但某些服务(如防盗链)可能依赖完整Referer
  4. 服务端配合
    即使设置了no-referrer,某些浏览器仍可能通过Origin头发送源站信息

<!-- 全局设置示例 -->
<meta name="referrer" content="strict-origin-when-cross-origin">

五、与其他技术的协作

结合CSP策略

Content Security Policy也可以控制Referer行为:

<!-- 技术栈:HTML + CSP -->
<meta http-equiv="Content-Security-Policy" 
      content="referrer strict-origin-when-cross-origin">

与JavaScript的交互

通过document.referrer可以读取当前页面的Referer(受策略限制):

// 技术栈:JavaScript
console.log(document.referrer); 
// 如果上级页面设置了no-referrer,这里将得到空字符串

六、总结

通过精细控制referrerpolicy,我们能在隐私保护、安全性和功能性之间取得平衡。关键点回顾:

  • 优先使用strict-origin-when-cross-origin作为安全默认值
  • 敏感操作使用no-referrerstrict-origin
  • 注意与服务端策略的配合
  • 在CDN等性能敏感场景合理优化

记住:没有放之四海而皆准的策略,根据你的具体场景选择最合适的配置吧!