nginx记录url参数的关键是准确捕获$args或$query_string变量:方式一用$request直接记录含参数的完整请求行(如get /api?id=123 http/1.1);方式二用$arg_xxx提取特定参数(如$arg_id);方式三拼接$scheme://$host$request_uri生成完整url,但需注意$host安全性。

要让 Nginx 记录每个请求的完整 URL 参数(即 query string),关键不是“还原原始 URL”,而是准确捕获并格式化 $args 或 $query_string 变量,并将其写入 access log。Nginx 本身不拼接 scheme + host + path + args 成完整 URL,但你可以记录构成它的全部必要字段,或直接记录带参数的请求行。
以下是两种常用、稳定、无需额外模块的配置方式:
记录带参数的完整请求行(最简实用)
Nginx 的内置变量 `$request` 已包含方法、URI(含 query string)和协议三部分,例如: ``` GET /api/user?id=123&name=test HTTP/1.1 ``` 它天然保留了原始 URL 中的参数(包括编码后的 `%20` 等),无需额外处理。只需在 http 块中定义日志格式并启用:
```nginx
log_format with_args '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$args"';
access_log /var/log/nginx/access.log with_args;
```
✅ 优点:零依赖、兼容所有版本、参数原样保留(含编码)、易解析
⚠️ 注意:$args 单独记录时是解码前的原始字符串(如 q=hello%20world),与 $request 中一致;若需解码后内容,Nginx 原生不支持,需后端或日志分析阶段处理。
按需提取特定 URL 参数(结构化记录)
当只关注某几个关键参数(如 `id`、`token`、`utm_source`),可使用 `$arg_XXX` 变量精准提取,适合审计或告警:```nginx
log_format structured '$remote_addr [$time_local] '
'method="$request_method" '
'path="$uri" '
'args="$args" '
'id="$arg_id" '
'token="$arg_token" '
'utm="$arg_utm_source" '
'status=$status';
access_log /var/log/nginx/structured.log structured;
```
✅ 优点:字段清晰、便于 grep / ELK 过滤、空值自动为空字符串
⚠️ 注意:变量名严格小写且下划线替换短横线(如 ?X-Api-Key=abc → 用 $arg_x_api_key)
补充:记录完整可访问 URL(含协议和域名)
若需类似 `https://example.com/path?a=1&b=2` 的完整地址,需手动拼接(注意安全性和可靠性):```nginx
# 判断是否 HTTPS(通过 X-Forwarded-Proto 或 $scheme)
map $http_x_forwarded_proto $scheme_real {
default $scheme;
https https;
}
log_format full_url '$remote_addr - $remote_user [$time_local] '
'"$scheme_real://$host$request_uri" '
'$status $body_bytes_sent';
access_log /var/log/nginx/full_url.log full_url;
```
✅ 适用场景:调试重定向、前端埋点校验
⚠️ 风险:$host 来自请求头,可能被伪造;生产环境建议仅用于内网或配合 underscores_in_headers on; + 信任代理头使用。
配置完成后,务必执行:
nginx -t && nginx -s reload
不复杂但容易忽略











