nginx可通过server块中rewrite+if判断实现伪静态,如将/index.php?id=123转为/article/123.html且url不变;需用if(!-e $request_filename)避免覆盖静态资源,rewrite规则用last标志内部重定向,并支持path_info统一入口简化配置。

直接在 Nginx 的 server 块中写 rewrite 规则,配合文件存在性判断,就能把 index.php?id=123 这类动态链接转成 /article/123.html 这样的静态外观,浏览器地址栏不变,后端仍走 PHP 处理。
核心配置:用 rewrite + if 判断实现基础伪静态
最常用也最稳妥的方式是先检查请求路径是否对应真实文件或目录,不存在时再触发重写:
- 在站点的
server块内添加 location 区块,通常放在 root 和 index 指令之后 - 使用
if (!-e $request_filename)确保只对非真实资源的请求做重写,避免覆盖 js/css/img 等静态文件 - rewrite 规则中用正则捕获参数,例如
^/article/(\d+)\.html$匹配/article/123.html,然后映射到/index.php?id=$1 - flag 推荐用
last,表示内部重定向,不改变浏览器 URL,且会重新匹配 location
典型规则示例:文章页和分页伪静态
假设你的 PHP 入口是 index.php,想让文章页和列表页都呈现 HTML 后缀:
- 文章详情:
rewrite ^/article/(\d+)\.html$ /index.php?action=article&id=$1 last; - 栏目列表:
rewrite ^/category/(\d+)/page-(\d+)\.html$ /index.php?action=category&cid=$1&page=$2 last; - 首页分页:
rewrite ^/page-(\d+)\.html$ /index.php?action=home&page=$1 last;
所有规则都放在同一个 location / { ... } 块里,按顺序匹配,靠前的优先生效。
更简洁写法:统一入口 + PATH_INFO 解析
如果你的 PHP 框架或程序支持 PATH_INFO(如 ThinkPHP、CodeIgniter),可把所有请求集中到一个入口,减少规则数量:
- 配置:
rewrite ^/(.*)\.html$ /index.php/$1 last; - 这样访问
/user/profile.html实际执行index.php/user/profile - PHP 中通过
$_SERVER['PATH_INFO']或框架路由自动解析路径,无需每个链接单独写 rule - 注意:需确保 PHP-FPM 配置启用
fastcgi_split_path_info并正确传递 PATH_INFO
调试与验证要点
规则写完不能直接上线,必须验证是否按预期工作:
- 修改配置后执行
nginx -t检查语法,再nginx -s reload生效 - 访问一个伪造的伪静态路径(如
/article/999.html),看是否返回 PHP 页面而非 404 - 打开 Nginx error log(
error_log /path/to/error.log notice;),开启notice级别可看到 rewrite 执行日志 - 确认 PHP 脚本能正常接收参数——比如
$_GET['id']是否拿到值,而不是空或报错
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











