$http_referer 是 Nginx 自动提取请求头中 Referer 字段的内置变量,值为空字符串或完整来源 URL;它不直接拦截请求,需配合 valid_referers 指令与 $invalid_referer 变量实现防盗链,但因 Referer 可伪造且受协议/浏览器限制,仅适用于基础流量防护。

在 Nginx 日志和配置中,$http_referer 是一个内置变量,它直接提取 HTTP 请求头中的 Referer 字段值。这个值本身不参与逻辑判断,但它是分析用户从哪来、以及是否允许访问资源的关键依据。
什么是 $http_referer?
它不是独立设置的变量,而是 Nginx 对请求头 Referer: 的自动映射。比如用户从 https://example.com/article 点击链接跳转到你的图片地址 https://cdn.yoursite.com/photo.jpg,浏览器发出的请求头中就会包含:
此时 $http_referer 的值就是 https://example.com/article。如果该字段为空(如直接输入 URL、HTTPS→HTTP 跳转、书签访问等),$http_referer 就是空字符串。
如何用 $http_referer 分析真实流量来源
它最常用在 access_log 中,帮助你区分自然访问、站外导流、搜索引擎、甚至异常爬虫。
- 在
log_format中加入$http_referer,例如:log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'; - 日志中会输出类似:
192.168.1.100 - - [07/May/2026:17:22:04 +0800] "GET /logo.png HTTP/1.1" 200 5243 "https://search.example.net/q?site=yoursite.com" "Mozilla/5.0..." - 配合日志分析工具(如 awk、GoAccess、ELK),可快速统计:
• 哪些外部域名带来最多图片请求
• 是否存在大量空 Referer 请求(可能为自动化脚本或盗链工具)
• 某个合作渠道的落地页点击转化率
如何结合 valid_referers 实现有效防盗链
$http_referer 本身不能拦截请求,必须配合 valid_referers 指令和 $invalid_referer 变量才能生效。
-
valid_referers定义合法来源,例如:valid_referers none blocked *.yoursite.com yoursite.com;
其中none允许空 Referer(适合 APP 内嵌页、微信内直接打开等场景),blocked允许被代理过滤过 Referer 的请求(如某些企业防火墙)。 - 匹配失败时,Nginx 自动将内置变量
$invalid_referer设为 1;可在 location 中写判断:if ($invalid_referer) { return 403; } - 更友好的做法是返回一张提示图:
rewrite ^/.*\.(jpg|jpeg|png|gif)$ /static/fangdao.png break;
要注意的常见陷阱
Referer 防盗链不是银弹,它的局限性必须提前认知:
- 客户端可轻易伪造 Referer(curl -H "Referer: https://yoursite.com" ...),所以不能用于权限校验或支付类关键流程
- HTTPS 页面跳转到 HTTP 页面时,浏览器主动清空 Referer(RFC 2616 强制要求),导致合法流量也被拦截
- 部分隐私浏览器(如 Firefox 的
network.http.referer.XOriginPolicy)、广告拦截插件、PWA 应用也会抑制或修改 Referer - 移动端微信、QQ 内置浏览器对 Referer 支持不稳定,有时为空,有时为 m.qq.com 或 web.wechat.com,需按实际日志调整白名单

















