Referrer信息是浏览器在发起跨站请求时自动携带的来源页面地址,它一方面支撑着统计分析、防盗链、归因追踪等常见功能,另一方面也可能把用户的浏览路径完整暴露给第三方站点。作为服务器管理者,通过Apache下发Referrer-Policy响应头,是控制这一行为最直接、最规范的方式。本文将从原理、策略值选择和具体配置三个层面,完整讲解如何在Apache中实施Referrer隐私控制。

一、理解Referrer机制与隐私风险
当用户从页面A点击链接跳转到页面B时,浏览器会在请求头中附带Referer字段(注意这个字段名的历史拼写就是Referer,少一个r),告知B站点用户来自哪里。如果页面A的URL中包含查询参数,比如搜索关键词、会话标识或邮箱验证令牌,这些敏感数据就会原封不动地流向B站点以及B站点引用的所有第三方资源服务器。
一个典型的场景是:用户通过带有重置令牌的链接进入某个管理后台,该页面又加载了外部的统计脚本或字体资源,此时完整的URL(含令牌)会作为Referrer发送给这些第三方服务器,造成严重的安全隐患。早期的no-referrer-when-downgrade默认策略在HTTPS向HTTPS的跳转中会发送完整URL,这在国内大量站点中沿用至今,隐私保护形同虚设。
需要区分的是,Referrer-Policy是一个由服务器通过响应头下发的指令,浏览器在加载该页面后,依据这个策略决定后续的子资源请求和链接跳转中Referrer如何裁剪。它还可以通过<meta>标签在页面级别设置,但在服务器层面统一配置显然更易于维护,也避免了遗漏。
二、主流策略值对比与选择建议
Referrer-Policy规范定义了多个策略值,理解它们的差异是正确配置的前提。以下是最常用的几个:
no-referrer:完全不发送Referrer,隐私保护最强,但会破坏统计和防盗链功能。no-referrer-when-downgrade:协议不降级时发送完整URL,降级时不发送,是浏览器传统默认值,隐私保护较弱。origin:只发送源(协议加域名加端口),不含路径和查询串,平衡性较好。origin-when-cross-origin:同源请求发送完整URL,跨源请求只发送源。same-origin:仅同源请求发送完整URL,跨源请求完全不发送,适合内部系统。strict-origin:与origin类似,但协议降级(如HTTPS到HTTP)时不发送。strict-origin-when-cross-origin:同源发送完整URL,跨源只发送源,且协议降级时不发送,这是现代浏览器的推荐默认值。
对绝大多数公开网站而言,strict-origin-when-cross-origin是首选:站内分析不受影响,跨站请求只暴露域名不暴露路径,兼顾了功能与隐私。如果站点完全不依赖Referrer做防盗链或归因,直接使用no-referrer最省心。内部管理后台则推荐same-origin,最大限度阻断内部URL外泄。
三、在Apache中配置Referrer-Policy的几种方式
Apache通过mod_headers模块设置响应头,绝大多数发行版默认已启用该模块。若未启用,在配置中加载即可。
第一种方式是全局配置,编辑主配置文件httpd.conf或在Ubuntu等系统的conf-available目录下新建配置:
# 启用mod_headers(若未启用)
# LoadModule headers_module modules/mod_headers.so
# 全局设置Referrer-Policy响应头
<IfModule mod_headers.c>
Header always set Referrer-Policy "strict-origin-when-cross-origin"
</IfModule>第二种方式是针对特定目录或虚拟主机设置。使用<Directory>或<VirtualHost>容器包裹,实现精细化的分区域策略:
<VirtualHost *:443>
ServerName www.ipipp.com
DocumentRoot /var/www/html
<IfModule mod_headers.c>
# 后台目录采用更严格的策略
<Directory /var/www/html/admin>
Header always set Referrer-Policy "same-origin"
</Directory>
# 其余目录使用推荐策略
<Directory /var/www/html>
Header always set Referrer-Policy "strict-origin-when-cross-origin"
</Directory>
</IfModule>
</VirtualHost>第三种方式是通过.htaccess文件,适合没有主配置文件修改权限的虚拟主机用户。前提是AllowOverride中允许使用FileInfo:
# 在站点根目录的.htaccess中添加
<IfModule mod_headers.c>
Header always set Referrer-Policy "no-referrer"
</IfModule>注意这里使用Header always set而非Header set。always关键字确保该头也会在错误响应(如404、403页面)中下发,避免错误页面绕过策略。set指令会覆盖任何已存在的同名头,如果担心重复下发,也可以先用unset清理再set。
配置完成后重启或重载Apache使设置生效:
# CentOS/RHEL sudo systemctl restart httpd # Ubuntu/Debian sudo systemctl reload apache2
四、验证配置与常见问题排查
验证最简单的方式是使用curl查看响应头:
curl -I https://www.ipipp.com/ # 期望输出中包含: # Referrer-Policy: strict-origin-when-cross-origin
也可以在浏览器开发者工具的Network面板中查看任意文档请求的响应头,或者访问在线的安全头检测服务,它们通常会给出Referrer-Policy的评级。
常见问题有几个:一是配置不生效,多半是mod_headers未加载或虚拟主机作用域写错,可以通过apachectl -M | grep headers确认模块状态;二是出现了重复的Referrer-Policy头,通常是全局与局部配置叠加导致,改用set指令或用Header unset清理即可;三是设置了策略但统计平台仍能拿到完整URL,这可能是页面内存在meta标签级别的Referrer策略覆盖,需要检查HTML源码中是否有<meta name="referrer">声明并与服务器策略保持一致。
还有一个容易被忽略的细节:Referrer-Policy只影响浏览器行为,对服务端之间的请求(如Apache作为反向代理转发请求)不起作用,代理场景下需要通过RequestHeader指令单独控制转发时的Referer头。此外,如果你同时配置了CSP(内容安全策略),两者互不冲突,可以并存下发。
总的来说,在Apache中配置Referrer-Policy成本极低,却能显著降低用户浏览路径和敏感查询参数外泄的风险。建议将strict-origin-when-cross-origin作为所有站点的默认策略,再根据具体业务区域按需收紧,这也是当前主流安全基线的一部分。
ApacheReferrer-Policy隐私控制修改时间:2026-09-01 22:52:39