Nginx Rewrite核心是PCRE正则匹配URI路径,需用^/$锚定、()捕获动态值、1+安全提取路径段,并注意rewrite仅处理路径不包含查询参数,避免循环重定向。/ ↩
正则表达式是 Nginx URL 重写的核心能力,匹配复杂网址结构的关键在于理解 URI 组成、掌握 PCRE 元字符含义,并精准控制锚点与捕获逻辑。
复杂路径常因缺少边界限制而匹配过宽。^ 和 $ 必须成对使用才能锁定完整 URI。
/user/123/profile,不匹配 /user/123/profile/edit 或 /v1/user/123/profile
/? 表示可选的斜杠.* 更安全——它表示“非斜杠的连续字符”,适合提取路径段,如 /blog/post-abc123 中的 post-abc123
括号 () 不仅用于逻辑分组,更是提取关键参数的手段,捕获内容通过 $1、$2 等引用。
/backend/v$1/users?id=$2,分别提取版本号和用户 ID(?:...) 避免干扰编号,例如 ^/(?:en|zh|ja)/products/([a-z0-9-]+)/?$,只捕获产品 slug,语言前缀不占 $1(w+)? 或 (?:&sort=w+)? 显式声明可选性,避免 .* 导致贪婪匹配越界真实 URL 含字母、数字、短横线、下划线甚至中文(需 UTF-8 编码),需合理构造字符集。
/article/如何配置-nginx
[0-9]{4}-[0-9]{2}-[0-9]{2} 更简洁;年份强制 4 位可防歧义$args,例如 /new-path?$args
复杂匹配容易引发循环重定向或规则失效,需主动防御。
last,尤其当 replacement 仍可能命中当前 location 时——改用 break 或移至 server 级error_log /var/log/nginx/rewrite.log notice; 并用 rewrite_log on; 查看实际匹配过程location ~ ^/api/ + proxy_pass 替代 rewrite,性能更优且逻辑更清晰