默认开启的merge_slashes on会自动将//api//v1///users等多斜杠uri规范化为/api/v1/users,确保location匹配准确;它仅作用于http块,影响所有server和location的路径解析,$uri为规范路径而$request_uri保留原始值。

默认就已启用,无需额外配置——Nginx 的 merge_slashes 指令在 http 块中默认为 on,会自动将请求路径中连续多个斜杠(如 //、///)合并为单个斜杠(/),确保 location 匹配、变量取值和代理转发都基于标准化路径进行。
它在哪起作用?
该指令只能写在 http { } 块中,全局生效,影响所有 server 和 location 的路径解析流程:
- 路径标准化发生在
location匹配之前,例如GET //api//v1///users能被location /api/v1/users { }正确命中 -
$uri变量始终是合并后的规范路径(如/api/v1/users) -
$request_uri始终保留原始请求(如/api//v1///users?x=1)
如何确认和显式启用?
绝大多数安装已默认开启,但若需验证或强制确保,可按以下步骤操作:
- 打开主配置文件(通常为
/etc/nginx/nginx.conf) - 在
http { }块内检查是否存在merge_slashes行;若无,添加merge_slashes on;;若为off,改为on - 执行
nginx -t测试语法,再运行nginx -s reload生效
怎么验证是否真正生效?
通过日志对比原始与处理后路径最直观:
- 在某
server块中添加:log_format debug '$request_uri → $uri';和access_log /var/log/nginx/debug.log debug; - 执行
curl -I http://your.site//test//abc - 查看日志输出:若显示
//test//abc → /test/abc,说明已正常工作
什么时候需要关掉它?
仅在极少数明确依赖原始多斜杠结构的场景下才考虑关闭(merge_slashes off;),例如:
- 后端服务用
//作为自定义协议分隔符(如某些老旧 CGI 实现) - 安全审计要求日志中严格记录原始路径格式(此时应配合
$request_uri使用) - 使用正则
location精确匹配含多斜杠的特定模式(不推荐,易出错且维护困难)
关闭后必须同步检查所有 location 定义、rewrite 条件及 proxy_pass 路径拼接逻辑,否则极易引发 404 或路径错误。










