要在Nginx日志中真实反映外部引流渠道,需显式定义含$http_referer的日志格式并启用,结合map指令分类来源,区分有效referer与干扰项(如"-"、空值、搜索引擎跳转等),提升归因准确性。

要在 Nginx 访问日志中真实反映外部引流渠道,关键不是简单加个字段,而是让 $http_referer 被准确采集、稳定记录,并能区分有效来源与干扰项。默认日志格式(如 combined)通常不包含它,直接查日志看到的多是 "-",后续分析就失去依据。
确认或定义含 referer 的日志格式
必须在 http 块中显式声明日志格式,确保包含 $http_referer 和 $http_user_agent,并用英文双引号包裹:
log_format source_log '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';- 注意拼写是
referer(少一个 r),不是referrer - 双引号不可省略,否则空格或特殊字符会导致日志截断
启用该格式并重载配置
在 server 或 http 块中指定日志路径和格式名:
access_log /var/log/nginx/access.log source_log;- 执行
nginx -s reload生效(避免restart中断服务) - 检查日志是否已出现类似
"https://baidu.com/s?wd=test" "Mozilla/5.0..."的内容
识别常见 referer 类型辅助归因
$http_referer 的值高度依赖访问场景,不能只看是否为空,要结合业务理解其含义:
-
"https://example.com/page":正常站外跳转,可信来源 -
"-":请求头无 referer —— 常见于直接输入网址、书签访问、HTTPS→HTTP 跳转、App 内 WebView、浏览器隐私模式 -
"https://google.com/url?...":搜索引擎结果页,但参数常被移动端截断 -
""(空字符串):极少见,多为异常或伪造请求,需单独排查
用 map 指令分类来源提升分析效率
相比 if,map 更安全高效,适合对 referer 做轻量级归类:
- 在
http块中添加:
default "other";
"-" "direct";
"~*baidu\.com" "baidu";
"~*google\.com" "google";
"~*zhihu\.com" "zhihu";
"~*weibo\.com" "weibo";
}
- 再把
$source_type加入log_format,日志中就能直接看到"baidu"或"direct",方便统计各渠道 PV/UV - 避免仅靠 referer 做权限控制,它可被客户端任意修改











