Nginx重写功能由ngx_http_rewrite_module模块提供,语法为rewrite<regex><replacement>[flag];regex用PCRE正则匹配URI,replacement支持$1等捕获组和内置变量,flag含last、break、redirect、permanent等控制行为。
Nginx 的重写(Rewrite)功能主要靠 rewrite 指令和 if、return、location 等配合实现,它本身没有独立的“重写模块”,而是由核心模块 ngx_http_rewrite_module 提供支持——这个模块默认编译进 Nginx,无需额外加载。
rewrite 用于修改请求 URI,语法为:
rewrite <正则表达式> <替换目标> [flag];
关键点:
i 可忽略大小写,如 ^/old/(.*)$ i)$1、$2 等捕获组,也可用内置变量如 $args、$host
last(内部重定向,重新匹配 location)、break(停止后续 rewrite,不重新匹配)、redirect(302 临时跳转)、permanent(301 永久跳转)if 在 server 或 location 块中可用于条件判断,但它的行为有陷阱:
if 块内只允许有限指令,rewrite 是其中之一,但 if 不是推荐的路由控制方式if 中用 root 或 rewrite 做复杂逻辑,容易引发重复执行或意外交互location 匹配路径,再在其中用 rewrite;需要条件时,考虑 map 指令预定义变量比如把旧域名跳转到新域名:
if ($host = 'old.example.com') {return 301 https://new.example.com$request_uri;}
又如统一移除 URL 尾部斜杠(非目录时):
rewrite ^/(.*)/$ /$1 permanent;
再如将 PHP 脚本路径伪装成静态路径:
rewrite ^/article/(d+).html$ /article.php?id=$1 last;
注意:这类规则需确保后端能正确接收参数,且不要和 location ~ .php$ 冲突。
开启重写日志可直观看到每步执行过程:
rewrite_log on;
error_log /var/log/nginx/rewrite.log notice;