Apache 默认 access_log 不记录 Referer,需在 LogFormat 中添加 %{Referer}i 才能记录;该字段值来自请求头,为空或缺失时记为“-”,可用于来源分析但不可信,需结合 UA 等字段甄别。

Apache 的 access_log 默认不直接记录完整的 Referer 字段内容,但只要配置得当,它完全可以用于追踪请求的来源页面(Referer),这对分析流量来源、识别爬虫、排查盗链或统计推广效果非常有用。
Referer 在 access_log 中的默认行为
Apache 默认日志格式(Common Log Format, CLF)只包含客户端 IP、时间、请求行、状态码和字节数,不包含 Referer。要记录 Referer,必须显式在 LogFormat 中添加 %{Referer}i 占位符。
-
%{Referer}i表示请求头中Referer:字段的原始值(注意大小写不敏感,referer或REFERER均可匹配) - 若请求未携带 Referer(如直接输入 URL、HTTPS→HTTP 跳转、浏览器隐私模式等),该字段记录为
- - 空 Referer(如
curl -H "Referer:" ...)也会记为-,需结合 User-Agent 等字段甄别
启用 Referer 记录的配置方法
编辑 Apache 配置文件(如 httpd.conf 或虚拟主机配置),修改或新增 LogFormat:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined_with_ref
CustomLog "logs/access_log" combined_with_ref重启 Apache 后,日志行末尾将出现 Referer 和 User-Agent,例如:
立即学习“Java免费学习笔记(深入)”;
192.168.1.100 - - [10/Jan/2024:14:22:35 +0800] "GET /api/user HTTP/1.1" 200 124 "https://example.com/dashboard" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)..."
用 Java 解析并分析 access_log 中的 Referer
Java 本身不处理 Apache 日志,但可通过读取日志文件 + 正则解析,提取 Referer 并做统计分析:
- 使用
BufferedReader逐行读取日志,避免内存溢出 - 推荐用正则匹配 Referer 字段(注意引号包围、可能含空格和特殊字符),例如:
"([^"]*)"\s+"([^"]*)"$匹配最后两个双引号内的内容(Referer 和 UA) - 对 Referer 做归一化:统一小写、截断查询参数(如保留
https://site.com/path,去掉?utm_source=...)、过滤空值和无效协议(如about:blank) - 常见分析方向:
– 按域名聚合统计来源 Top 10
– 识别异常 Referer(含恶意关键词、超长字符串、编码混淆)
– 关联请求路径,判断是否盗链(如 Referer 非本站但请求了/images/xxx.jpg)
注意事项与常见问题
Referer 是客户端主动发送的 HTTP 头,不可信、易伪造,仅适合辅助分析:
- HTTPS 页面跳转到 HTTP 页面时,浏览器会主动清空 Referer(安全策略),导致大量
- - 部分浏览器扩展、隐私插件(如 RefControl)会屏蔽或修改 Referer
- 移动端 WebView、小程序、App 内嵌页可能不发送 Referer,或发送固定值(如
app://host) - Apache 不会校验 Referer 格式,非法值(如换行、NUL 字符)可能导致日志解析失败,建议预处理过滤

















