nginx可通过记录$http_origin字段实现跨域请求来源可追溯,需在log_format中显式添加该变量,非空值即标识跨域请求,结合状态码可区分预检(204)与实际调用,但无法捕获浏览器静默拦截等前端侧失败。

Nginx 访问日志本身不直接记录“跨域请求”这个语义,它只记录原始 HTTP 请求信息。但你可以通过提取 $http_origin 字段,明确看到每次跨域请求来自哪个域名,从而实现对跨域调用来源的可追溯监控。
在 access_log 中记录 Origin 头部
Nginx 默认 access_log 不包含 Origin 请求头,需手动扩展日志格式:
- 在
http块中定义自定义日志格式,加入$http_origin - 示例配置:
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_origin"';
access_log /var/log/nginx/access.log main;
这样每条日志末尾就会追加请求携带的 Origin 值,例如:
192.168.1.100 - - [03/Sep/2026:12:30:45 +0800] "GET /api/user HTTP/1.1" 200 124 "-" "Mozilla/5.0" "https://admin.example.org"
区分跨域请求与同源请求
并非所有带 Origin 头的请求都是跨域失败的——浏览器对所有跨域请求(包括预检 OPTIONS)都会发送该头,但同源请求通常不带。因此:
- 日志中
$http_origin非空,基本可判定为跨域发起的请求 - 若响应状态码为
204(常见于 OPTIONS 预检返回),且$http_origin存在,说明是预检流程 - 若状态码为
0或连接中断(Nginx 日志里可能记为"-" "0"),则可能是前端被浏览器静默拦截,此时需结合前端错误监控定位
按来源域名聚合分析跨域调用
有了含 $http_origin 的日志,可用标准工具做统计:
- 查看最近 100 条跨域请求来源:
tail -100 /var/log/nginx/access.log | awk '{print $13}' | sort | uniq -c | sort -nr - 筛选特定域名的调用:
grep 'https://app.company.com' /var/log/nginx/access.log - 配合 logrotate 和 ELK / Grafana,可构建跨域调用来源看板,识别异常新增源或高频调用方
注意:日志不能替代前端错误捕获
访问日志只能反映“浏览器发出了什么请求”,无法告诉你:
- 请求是否被浏览器因 CORS 拒绝而静默丢弃(控制台报错但无 Nginx 日志)
- fetch 报
Failed to fetch是预检失败、证书问题,还是网络中断 - 用户禁用了第三方 Cookie 或启用了严格模式导致凭据不携带
所以真实跨域问题排查必须前后端协同:Nginx 日志用于确认服务端是否收到、是否返回了正确 CORS 头;前端需用 try/catch、unhandledrejection 和 Axios 拦截器主动上报失败详情。











