nginx 默认通过 merge_slashes 自动归一化多余斜杠,将 //api///v1// 转为 /api/v1/;该指令默认 on,仅限 http 块配置,$uri 为归一化路径,$request_uri 保留原始值。

Nginx 默认就能处理多余斜杠,不需要额外重写——它通过 merge_slashes 自动把 //api///v1// 这类路径归一化为 /api/v1/,这是底层路径标准化的第一步。
merge_slashes 是默认生效的归一化开关
这个指令控制 Nginx 在 location 匹配前是否合并连续斜杠:
- 默认值是
on,且只能放在http { ... }块中 - 开启后,所有请求如
GET //app//static///css/main.css会被内部转成/app/static/css/main.css,再进入 location 匹配和$uri变量赋值 -
$request_uri始终保留原始值(比如//app//static///css/main.css?debug=1),方便日志审计或条件判断
你不需要写 rewrite 规则来“修复”多斜杠,因为 Nginx 已在解析阶段完成这件事。如果发现多斜杠仍导致 404,问题通常出在 location 定义没覆盖归一化后的路径,而不是归一化没生效。
需要手动干预的两种典型场景
当归一化本身不够用时,才需配合 rewrite 或 proxy_pass 控制路径行为:
-
代理转发时路径错位:比如前端请求
/api//v1/users,归一化后是/api/v1/users,但后端只认/v1/users。这时用location /api/ { proxy_pass http://backend/; },Nginx 会自动剥离/api/前缀,转发为/v1/users -
需要统一跳转(301)暴露规范 URL:浏览器地址栏仍显示多斜杠,你想强制重定向到干净路径。可加一条精确匹配:
location ~ ^/(.*)//+(.*)$ { return 301 /$1/$2$request_uri; }注意:正则中
//+匹配两个及以上斜杠,$request_uri保留查询参数;实际部署前建议用 curl 测试跳转逻辑是否闭环
验证归一化是否真正起效
别只看返回结果,重点检查变量行为:
- 访问
curl -I "http://localhost//test///index.html?x=1" - 查看响应头中的
Location(如有重定向)和 access log 中的$uri字段 - 对比
$uri(应为/test/index.html)和$request_uri(应为//test///index.html?x=1)是否符合预期
不复杂但容易忽略











