应使用 $uri 或 $document_uri 记录跳转后的最终 URI,因为 $request_uri 始终保持客户端原始请求路径,不随内部 rewrite、index 或重定向改变;而 $uri 是 Nginx 内部处理后规范化的真实匹配路径(不含 query string),配合 $request_args 可还原完整请求地址。

要让 Nginx 的 access_log 记录跳转后的最终访问 URI(即经过内部重定向、rewrite 或 index 指令处理后实际匹配的 URI),关键在于使用 $uri 或 $document_uri 变量,而不是 $request_uri。
为什么 $request_uri 不符合要求
$request_uri 保存的是客户端原始请求的完整 URI(含 query string),它在请求初始阶段就已固定,不会随内部重写、重定向或 index 指令改变。例如:
- 用户请求
/,Nginx 执行index index.html;→ 实际响应的是/index.html - 用户请求
/old,被rewrite ^/old$ /new permanent;重定向 → 客户端收到 301,但$request_uri仍是/old
这些场景下,$request_uri 无法反映服务端最终处理的资源路径。
用 $uri 或 $document_uri 记录最终 URI
$uri 和 $document_uri 是等价的,它们表示当前请求匹配到的、经过所有内部重写和索引处理后的规范化 URI(不含 query string)。这是真正被 location 匹配并由后端或静态文件服务响应的路径。
对设计或页面进行 WCAG 2.1 AA 无障碍审计。触发关键词:“audit accessibility”、 “check a11y”、 “is this accessible?” 或在审查设计时使用。
- 配置示例(在
http块中定义日志格式):
其中 $uri 是最终 URI,$request_args(等价于 $args)可显式补上查询参数,组合成完整路径。
- 启用该格式:
注意代理环境下的真实路径
若 Nginx 前有 CDN 或反向代理,且上游已修改 Host 或路径,需确保:
-
$uri仍由 Nginx 自身解析决定,不受X-Forwarded-For或X-Forwarded-Uri影响 —— 它始终是 Nginx 内部路由后的结果 - 如需记录原始请求路径供对比,可同时保留
$request_uri,例如:"orig: $request_uri, final: $uri"
验证是否生效
重启 Nginx 后触发一次带 rewrite 或 index 的请求,查看日志:
- 访问
https://example.com/→ 日志中$uri应为/index.html(若配置了index index.html) - 访问
https://example.com/api/v1被rewrite ^/api/(.*)$ /backend/$1 break;→ 日志中$uri应为/backend/v1

















