根本原则是不在url中传递敏感信息,应改用post请求体或authorization头传输;nginx原生不支持动态脱敏,可用map做有限替换或nginx-lua模块实现可靠实时清洗。

直接在 Nginx 的 access_log 中过滤 URL 中的明文密码或 Token,不能靠正则替换或日志格式“隐藏”敏感参数——因为 Nginx 的 log_format 不支持运行时对变量值做条件脱敏(如匹配 pwd= 后截断),且 $request_uri 或 $args 是原始字符串,无法安全擦除特定键值。
根本原则:不在 URL 中传递敏感信息
这是最有效、最合规的做法。HTTP GET 请求的 URL 会完整记录在 access_log、代理层、浏览器历史、CDN 缓存、服务端错误堆栈中,极易泄露。
- 将密码、Token、API key 等一律改用
POST请求体(application/json或application/x-www-form-urlencoded)传输 - 前端避免拼接
?token=xxx&pwd=123类 URL;后端拒绝处理含pwd=、password=、auth_token=、api_key=等参数的 GET 请求(可返回 400) - 使用标准鉴权方式:Bearer Token 放在
Authorization: Bearer xxx请求头,而非 URL
若必须兼容旧链路:用 map + log_format 做有限脱敏
Nginx 本身不支持动态重写 $args,但可用 map 预定义规则,将含敏感参数的 URI 替换为脱敏版本(仅适用于固定参数名、且能接受部分误伤的场景):
# 在 http 块中定义
map $request_uri $sanitized_uri {
~^(?<pre class="brush:php;toolbar:false;" fix>[^?]*\?)((?!(pwd|password|token|auth_token|api_key)=)[^&]*&)*((pwd|password|token|auth_token|api_key)=[^&]*&?)(?<suffix>.*)$ "${prefix}${suffix}";
~^(?<pre class="brush:php;toolbar:false;" fix>[^?]*\?)(?<suffix>.*)(pwd|password|token|auth_token|api_key)=[^&]*$ "${prefix}${suffix}";
default $request_uri;
}
<p>log_format secure '$remote_addr - $remote_user [$time_local] '
'"$request_method $sanitized_uri $server_protocol" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent"';
access_log /var/log/nginx/access.log secure;</p></suffix>⚠️ 注意:
– 此方案依赖 PCRE 正则,性能略降,且无法覆盖嵌套编码(如 pwd%3D123)、大小写变体(PWD=)、或参数名被混淆的情况
– map 不支持嵌套逻辑,复杂清洗需 Lua(见下条)
高可靠性方案:用 nginx-lua 模块实时脱敏
启用 nginx-lua(OpenResty 或编译含 lua-nginx-module),在日志写入前清理参数:
log_by_lua_block {
local uri = ngx.var.request_uri
-- 移除常见敏感参数(支持 URL 编码)
local sanitized = string.gsub(uri, "[?&](pwd|password|token|auth_token|api_key)=[^&]*", "")
sanitized = string.gsub(sanitized, "[?&]$", "") -- 清理末尾残留 ? 或 &
ngx.var.sanitized_uri = sanitized
}再配合自定义 log_format:
log_format secure '... "$sanitized_uri" ...'; access_log /var/log/nginx/access.log secure;
✅ 优势:支持 decode + 多轮匹配、大小写不敏感、可扩展校验逻辑(如 token 长度特征)
❌ 要求部署 OpenResty 或自编译 Nginx,运维成本略高
配套加固建议
- 开启
secure_link或 JWT 验证,替代 URL 中传 token - 用 WAF(如 ModSecurity)在入口层拦截含敏感参数的请求,直接阻断而非仅脱敏
- 定期扫描 access_log,用脚本 grep
pwd=、token=等关键词,发现未收敛的泄露点 - 所有测试环境禁用 access_log,或单独隔离日志路径并限制读取权限











