隐私模式下Referer被清空是浏览器标准行为,Nginx需显式配置valid_referers none才能允许空Referer,否则触发403;应仅对静态资源启用防盗链,避免误拦API或登录页,并通过日志验证配置效果。

隐私模式下 Referer 被清空是浏览器标准行为,不是配置错误。Nginx 本身无法“恢复”被浏览器丢弃的 Referer,但可以通过合理配置白名单兼容这一场景。
必须显式允许空 Referer(none)
valid_referers 指令默认不接受空值。若未声明 none,所有隐私模式、地址栏直输、书签访问都会触发 $invalid_referer = 1,导致 403。正确写法示例:
valid_referers none *.example.com example.com;valid_referers none ~\.google\. ~\.baidu\.;
注意:none 必须放在最前面或显式写出,不能省略。
区分 blocked 和 none 的实际含义
浏览器在某些情况下(如 HTTPS 页面跳转到 HTTP 目标、代理中转、部分扩展拦截)会发送一个不完整或被截断的 Referer(例如只有域名,无协议;或为空字符串)。这时 blocked 选项可覆盖这类请求:
valid_referers none blocked *.example.com;- 它匹配 Referer 字段存在但不可信(如
example.com或https://等无效格式)的情况
避免误判:别把防盗链套在所有接口上
Referer 在隐私模式、API 调用、小程序、单页应用路由跳转中本就不可靠。不应在以下位置硬加 valid_referers:
-
location /api/ { ... }—— API 请求通常无 Referer 或由前端脚本发起,易误拦 -
location /login { ... }—— 登录页常被收藏或直访,依赖 none 才能正常打开 - 建议只用于静态资源路径,如
location ~* \.(jpg|png|css|js)$
验证是否生效:看真实日志,不靠猜测
加一条日志格式,确认浏览器到底发了什么:
log_format referer_log '$remote_addr - $http_referer $invalid_referer $request';access_log /var/log/nginx/referer.log referer_log;
隐私模式访问时,日志中应看到 "-" 1 或 "" 1,说明 Referer 为空;若配置正确且含 none,则 $invalid_referer 应为 0,请求不会被拦截。


















