nginx 通过 location 中 rewrite 实现伪静态,核心是正则匹配 uri 并重写为真实路径,配合 last/break/redirect 等 flag 控制跳转行为;典型用法如将 /article/123 重写为 /index.php?r=article/view&id=123;更推荐 try_files 优先匹配静态资源再回退至 php 入口。

Nginx 在 location 块中使用 rewrite 实现伪静态,核心是匹配请求路径后重写为真实资源路径(如 PHP 脚本),同时控制是否内部跳转或外部重定向。
rewrite 语法和关键参数
rewrite regex replacement [flag];
其中:
- regex:PCRE 正则表达式,匹配请求的 URI(不含域名和参数)
-
replacement:重写目标,可含捕获组(
$1、$2等)或变量($args、$request_uri) -
flag 可选值:
-
last:重写后停止当前 location 匹配,重新用新 URI 匹配 location(常用,实现内部跳转) -
break:重写后不再执行后续 rewrite,也不重新匹配 location(适合简单替换) -
redirect:返回 302 临时重定向(带完整 URL) -
permanent:返回 301 永久重定向
-
在 location 中配置伪静态的典型写法
常见场景:把 /article/123 重写为 /index.php?r=article/view&id=123
示例配置:
location /article/ {
rewrite ^/article/(\d+)$ /index.php?r=article/view&id=$1 last;
}
说明:
- 正则
^/article/(\d+)$精确匹配以/article/开头、后跟数字的路径 -
$1引用第一个捕获组(即 ID 数字) -
last确保重写后交由location ~ \.php$或其他 PHP 处理块接管
配合 try_files 实现更安全的伪静态
相比纯 rewrite,try_files 更推荐用于静态文件优先、动态回退的场景:
location / {
try_files $uri $uri/ /index.php?$args;
}
含义:
- 先尝试找真实存在的文件(
$uri) - 再找目录(
$uri/) - 都不命中,则交给
index.php并透传原始查询参数($args)
这种方式避免了 rewrite 的嵌套风险,也更符合现代 PHP 框架(如 Laravel、ThinkPHP)的路由入口习惯。
注意事项和常见坑
使用 rewrite 时需注意:
- 正则开头加
^、结尾加$防止误匹配(如不加$,/article/123456也会匹配/article/123) - location 匹配的是 URI 解码后的路径,但 rewrite 中的正则操作对象也是解码后的内容(无需手动 decode)
- 若 replacement 以
/开头,表示绝对路径重写;不以/开头则为相对路径(通常不建议) - 多个 rewrite 按顺序执行,
last会中断后续,break则只停在当前 block 内











