最可靠方式是在server块顶部用rewrite指令规范化URL:rewrite ^(.*)//+(.*)$ $1/$2 permanent;并设置merge_slashes off确保rewrite处理原始多斜杠。

在 Nginx 中,修复 URL 中多余的连续斜杠(如 //、///)最可靠的方式是使用 rewrite 指令配合正则表达式,在请求进入 location 块前进行规范化处理。
在 server 块顶部统一处理多余斜杠
推荐将 rewrite 规则放在 server 块的最外层(即所有 location 之前),确保所有请求都经过标准化:
# 合并多个连续斜杠为单个斜杠(保留开头的协议斜杠,不破坏 //domain 格式)
rewrite ^(.*)//+(.*)$ $1/$2 permanent;
# 可选:再处理一次,覆盖可能残留的三重及以上斜杠(如 /// → /)
rewrite ^(.*)/{2,}(.*)$ $1/$2 permanent;
说明:
• ^.*//+.*$ 匹配任意位置出现两个及以上连续斜杠;
• $1/$2 将其替换为单个 /,实现路径扁平化;
• 使用 permanent 返回 301,利于 SEO 和缓存一致性(如需内部重写不跳转,改用 last 或 break)。
避免 location 匹配异常的关键点
Nginx 的 location 匹配基于原始 URI(未解码、未标准化),而 rewrite 在匹配后执行。因此必须注意:
- 若把 rewrite 放在某个
location内部,只对该 location 生效,无法覆盖全部路径; - 不要依赖
location ~* ^/+类写法来“捕获多斜杠”——它无法匹配//api/v1这类开头就多斜杠的请求,因为 Nginx 会自动将 URI 归一化为/api/v1再做匹配; - 真正有效的时机是在 server 级解析 URI 阶段,用 rewrite 提前干预。
配合 merge_slashes 关闭更稳妥
Nginx 默认开启 merge_slashes on(从 1.11.1 起),它会在内部自动折叠路径中的重复斜杠,但仅影响后续处理(如文件路径拼接),**不影响 rewrite 的输入 URI**。为避免行为混淆,建议显式关闭并完全交由 rewrite 控制:
merge_slashes off;
# 然后再写上面的 rewrite 规则
这样可确保 rewrite 总是看到原始请求中的多斜杠,逻辑更可预测。
测试与验证方法
部署后可用 curl 快速验证:
-
curl -I http://your.site///api//v1/→ 应返回 301,Location 头为/api/v1/; -
curl -I http://your.site//static/css//main.css→ 应重定向为/static/css/main.css; - 检查 access.log,确认状态码和重写后的 URI 是否符合预期。
注意:浏览器地址栏会自动显示重写后的干净路径,服务端日志中原始请求仍保留多斜杠,可用于审计。


















