Nginx URL路径规范化核心是用rewrite指令统一入口、消除歧义、修复不规范路径,需将rewrite置于location块内而非if块,按全局性、路径级分层处理,并合理选用permanent/last/break等flag。
Nginx 做 URL 路径规范化,核心是用 rewrite 指令统一入口、消除歧义、修复不规范路径,比如去掉多余斜杠、强制小写、补全或截断尾部 /、统一参数顺序等。关键不是“写得多”,而是位置对、正则准、flag 选得稳。
rewrite 必须放在 location 块里,别塞进 if
if 块语义模糊、执行时机错位,最新明确不推荐在其中使用 rewrite。真正安全可控的写法是:
server 块顶层/blog/ → /blog、/POST/123 → /post/123)→ 放在对应 location 内常用路径规范化场景与写法
去掉路径末尾多余斜杠(除根路径外)
location ~ ^(.+)/+$ {rewrite ^(.+)/+$ $1 permanent;}
注意:permanent 是 301,浏览器地址栏会变;若只想内部处理,用 last 或 break,但需确保后续 location 能接住。
强制小写路径(适用于大小写敏感的后端或静态资源)
location / {if ($request_uri ~ ^/(.*)$) {set $lowercase $1;# Nginx 本身不支持 strtolower,需配合 map 或 Lua;纯配置建议用外部工具预处理}}
纯 Nginx 配置无法直接转小写——这是常见误区。真要大小写归一,推荐:
map 预定义小写映射(适合有限路径)$uri_lowercase
统一去除或补全 trailing slash(按业务约定)
若约定「目录必须带 /」:
location ~ ^/[^.]*[^/]$ {rewrite ^(/[^.]*[^/])$ $1/ permanent;}
若约定「所有路径都不带 /(除 / 本身)」:
location ~ ^/(.+?)/$ {rewrite ^/(.+?)/$ /$1 permanent;}
合并重复路径段(如 /api//v1//user → /api/v1/user)
location / {rewrite ^//+ / permanent; # 多个开头斜杠rewrite ^/(.+)/+/(.+)$ /$1/$2 permanent;# 中间多斜杠}
flag 别乱选:规范化多数用 permanent 或 last
permanent:用户看到地址变化,搜索引擎收录新路径,适合对外暴露的 URL 归一(如 SEO 友好调整)last:内部重写后重新匹配 location,适合路径改写后仍需走同一套处理逻辑(如 /old-api/xxx → /api/v2/xxx,且已有 location /api/)break:改完就执行当前 location 下剩余指令(如 proxy_pass 或 try_files),适合不希望再进其他 location 的场景redirect(302)用于长期规范化——它不传递权重,也不被缓存,仅适合临时过渡搭配 try_files 提升健壮性
单纯 rewrite 不解决“路径存在与否”的问题。规范化后,务必确认目标路径能被正确服务:
location / {# 先规范化rewrite ^/product/(d+).html$ /product?id=$1 last;# 再尝试命中静态文件或回退到入口try_files $uri $uri/ /index.php?$query_string;}
这样即使重写后的 /product?id=123 没有对应静态文件,也能交由 PHP 处理,而不是直接 404。
基本上就这些。