Nginx中无法直接全局重写请求头或剔除URL参数,但可通过map预处理$args构造$new_args,配合rewrite实现参数剔除;proxy_set_header用于修改转发至后端的请求头,空值可删除头,map还可动态重写Referer等头。

在 Nginx 中,server 块本身不直接支持“全局请求头重写”或“参数剔除”,但可通过 rewrite、map、proxy_set_header 和 if(慎用)等指令组合实现类似效果。关键在于:请求头重写主要作用于**转发给后端的请求头**(即 proxy_set_header),而 URL 参数剔除需在请求进入 server 时通过 rewrite 或 map + try_files 等方式干预 URI。
统一剔除指定查询参数(如 utm_ 类、debug=1)
使用 map 指令预处理 $args,构造不含目标参数的新参数串,再用 rewrite 重写 URI:
map $args $new_args {
~^(.*)(?:^|&)(utm_[^&]*|debug=[^&]*|ref=[^&]*)(?:&|$)(.*)$ "$1$3";
default $args;
}
<p>server {
listen 80;
server_name example.com;</p><pre class="brush:php;toolbar:false;"># 剔除后重写请求,保留路径和干净参数
if ($args != $new_args) {
rewrite ^(.*)$ $1?$new_args? permanent;
}
# 后续 location 处理真实请求
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
}
}
注意:避免在 if 中使用 proxy_pass;此处 if 仅用于重定向剔参,确保客户端看到的是净化后的 URL。
修改/覆盖发送给后端的请求头(如添加 X-Real-IP、删除敏感头)
使用 proxy_set_header 可覆盖或新增请求头;用空字符串可“删除”某些头(Nginx 不会发送值为空的 header):
-
强制设置标准头:
proxy_set_header X-Real-IP $remote_addr; -
清除客户端传来的危险头:
proxy_set_header X-Forwarded-For "";(后端将收不到该头) -
动态重写 Host 头:
proxy_set_header Host $host;或固定为proxy_set_header Host backend.example.com; -
禁止透传特定头:不声明即默认不透传;若上游已设,可用
proxy_hide_header(仅对响应头生效)
拦截并改写特定请求头(如 Authorization、Referer)
Nginx 无法直接修改客户端发来的原始请求头,但可在代理转发时**重写其值**。例如:
location /api/ {
# 将 Bearer Token 替换为固定测试 token(仅用于调试)
proxy_set_header Authorization "Bearer abc123";
<pre class="brush:php;toolbar:false;"># 或根据条件动态设置(配合 map)
proxy_set_header Referer $safe_referer;
}
map $http_referer $safe_referer { ~^https?://(app|web).example.com/ $http_referer; default "-"; }
这样既避免了非法来源伪造 Referer,又保留了合法来源。
安全提示与替代建议
-
if在location外使用有风险,优先考虑map + rewrite方案 - 参数剔除若只为后端逻辑干净,也可在应用层处理(更可控);Nginx 层适合做统一收敛
- 敏感头(如
Cookie、Authorization)不应随意重写,除非明确业务需要 - 启用
log_format记录原始和处理后参数,便于调试:$args和$new_args











