Nginx 的 merge_slashes 指令默认开启(on),用于将请求 URI 中连续多斜杠自动合并为单斜杠,仅可配置于 http 块中,影响 location 匹配与后端处理。

在 Nginx 中,merge_slashes 指令用于控制是否将请求 URI 中连续的多个斜杠(//、/// 等)自动合并为单个斜杠(/)。该指令默认开启(on),作用于 http 块,影响所有 server 和 location 的路径规范化行为。
merge_slashes 的作用与默认行为
当客户端发起类似 GET //api//v1//users/ 的请求时,若 merge_slashes on(默认),Nginx 会在内部将路径标准化为 /api/v1/users/ 后再进行 location 匹配和后续处理。这能避免因冗余斜杠导致 location 未命中或后端服务解析异常。关闭后,原始路径(含多斜杠)会原样传递,可能引发匹配失败或安全风险(如绕过某些基于路径前缀的限制)。
如何配置 merge_slashes
该指令仅支持 on 或 off,且只能出现在 http 块中(不能写在 server 或 location 内):
-
正确写法(http 级别):
http {<br> merge_slashes on; # 或 off<br> server { ... }<br>} -
错误写法(位置非法):
server { merge_slashes off; }或location /api { merge_slashes off; }—— 会触发 Nginx 启动报错。
关闭 merge_slashes 的典型场景
极少数情况下需关闭,例如:
- 后端应用明确依赖原始路径中的多斜杠做特殊路由(如某些遗留 CGI 脚本);
- 配合自定义 rewrite 规则对多斜杠做差异化处理(如重定向到规范路径并返回 301);
- 安全审计要求严格保留原始请求结构以供日志分析(但更推荐用
$request_uri记录原始值)。
注意:关闭后需确保所有 location 正则或前缀匹配能覆盖多斜杠变体,否则易出现 404。
验证 merge_slashes 是否生效
可通过以下方式确认:
- 检查 Nginx 配置语法:
nginx -t; - 发送含多斜杠请求并观察响应:
curl -I http://example.com//test//,对比响应头或后端 access_log 中的$uri变量值(已合并)与$request_uri(原始值); - 在 log_format 中同时记录两者便于比对:
log_format debug '$request_uri → $uri';

















