默认的 nginx access_log 并不自动包含 $http_referer 和 $http_user_agent,必须在 log_format 中显式定义这两个变量并用双引号包裹,再通过 access_log 指令引用该格式名,重启后日志才显示来源 url 和客户端标识。

默认的 Nginx access_log 就已包含 $http_referer 和 $http_user_agent,但前提是日志格式(log_format)中明确写了这两个变量。如果当前日志没显示 Referer 或 UA,大概率是格式定义里漏掉了,而不是功能不可用。
确认或添加 Referer 与 User-Agent 字段
在 http 块中检查或补充 log_format,确保包含以下两个变量:
-
$http_referer:记录跳转来源 URL(注意拼写是 referer,不是 referrer) -
$http_user_agent:记录浏览器、爬虫、App 等客户端标识
例如,定义一个含 Referer 和 UA 的格式:
log_format extended '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" "$http_user_agent"';
⚠️ 注意:"$http_referer" 和 "$http_user_agent" 必须用英文双引号包裹,否则空格或特殊字符会导致日志截断或解析异常。
启用该格式并指定日志路径
在 server 或 http 块中使用 access_log 指令引用上面定义的格式名(如 extended):
使用tbot机器ID身份文件配合tsh CLI,通过Teleport访问控制SSH登录托管主机或执行远程命令。
access_log /var/log/nginx/access.log extended;
这样每条日志行末尾就会出现类似这样的内容:
"https://example.com/page" "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X)..."处理代理场景下的 Referer 和 UA
若 Nginx 前有 CDN 或反向代理(如 Cloudflare、Nginx 自身做代理),原始 Referer 和 User-Agent 通常仍会透传,无需额外配置。但要注意:
-
$http_referer是客户端发起请求时自带的 HTTP 头,代理一般不会改写它(除非主动清除或伪造) -
$http_user_agent同理,只要代理未显式覆盖User-Agent头,就能真实记录终端信息 - 如果发现日志中 Referer 总是为空,可能是客户端没发该头(如直接输入 URL 回车、部分 App 请求),也可能是代理层过滤了该字段
验证是否生效
修改配置后执行:
nginx -t && nginx -s reload
然后发起一次带 Referer 的请求(比如用 curl):
curl -H "Referer: https://test.example/" -H "User-Agent: MyBot/1.0" http://your-domain.com/
查看日志文件最后一行,确认是否出现对应值。若仍为空,可临时加 echo $http_referer $http_user_agent; 到 location 中用 add_header 返回响应头辅助调试。










