Nginx rewrite规则用于在请求接入时将URL重写为后端可处理路径,实现伪静态(如/article/123→/index.php?id=123),提升SEO与体验;语法为rewrite <正则> <替换> [flag],常用last、break、redirect等标志,推荐配合try_files使用以避免循环和404。

Nginx 的 rewrite 规则用于将用户请求的 URL 按照设定逻辑重写为服务器内部可处理的路径,常用于实现伪静态(如把 /article/123 映射到 /index.php?id=123),提升 SEO 友好性和用户体验。它不依赖后端脚本改写,而是在 Nginx 接收请求时就完成路径转换。
理解 rewrite 指令基本语法
rewrite 规则写在 server 或 location 块中,格式为:
rewrite <正则表达式> <替换目标> [flag];
关键点:
-
正则表达式:对请求的 URI(不含域名和参数)进行匹配,常用
^/article/(\d+)$这类捕获组 -
替换目标:可直接写路径,也可用
$1、$2引用捕获内容,例如/index.php?id=$1 -
flag:常用
last(内部重写,继续匹配 location)、break(停止 rewrite,不再匹配后续规则)、redirect(302 临时跳转)、permanent(301 永久跳转)
常见伪静态场景写法示例
以下为实际开发中高频用例,均假设站点根目录为 /var/www/html:
-
文章页伪静态:把
/post/123→/index.php?post_id=123rewrite ^/post/(\d+)$ /index.php?post_id=$1 last; -
带分类的路径:把
/category/news/2024→/category.php?cat=news&year=2024rewrite ^/category/([^/]+)/(\d{4})$ /category.php?cat=$1&year=$2 last; -
隐藏 .php 后缀:访问
/about自动尝试/about.phprewrite ^/(.*)$ /$1.php last;(需配合try_files $uri.php $uri =404;更安全)
rewrite 和 try_files 配合更稳妥
单纯用 rewrite 容易引发循环或 404,推荐优先使用 try_files 处理静态资源 + rewrite 处理动态路由:
- 先检查文件是否存在,不存在再交给 PHP 路由入口:
try_files $uri $uri/ /index.php?$args; - 若需统一入口且保留原始路径(如 Laravel、ThinkPHP),可结合 fastcgi_param 传参:
fastcgi_param SCRIPT_FILENAME $document_root/index.php;fastcgi_param PATH_INFO $fastcgi_path_info;
调试 rewrite 规则的小技巧
rewrite 执行过程不可见,容易写错。启用日志快速定位问题:
- 在
http或server块中添加:rewrite_log on;error_log /var/log/nginx/rewrite.log notice; - 重启 Nginx 后,访问触发规则的 URL,查看日志中是否打印匹配与重写过程
- 注意:生产环境关闭
rewrite_log,避免性能损耗


















