一聚教程网:一个值得你收藏的教程网站

热门教程

Nginx 如何在 Nginx 中配置伪静态规则将动态 PHP 链接伪装成静态 HTML

时间:2026-08-14 20:26:50 编辑:袖梨 来源:一聚教程网

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 判断实现基础伪静态

最常用也最稳妥的方式是先检查请求路径是否对应真实文件或目录,不存在时再触发重写:

  1. 在站点的 server 块内添加 location 区块,通常放在 root 和 index 指令之后
  2. 使用 if (!-e $request_filename) 确保只对非真实资源的请求做重写,避免覆盖 js/css/img 等静态文件
  3. rewrite 规则中用正则捕获参数,例如 ^/article/(d+).html$ 匹配 /article/123.html,然后映射到 /index.php?id=$1
  4. flag 推荐用 last,表示内部重定向,不改变浏览器 URL,且会重新匹配 location

典型规则示例:文章页和分页伪静态

假设你的 PHP 入口是 index.php,想让文章页和列表页都呈现 HTML 后缀:

  1. 文章详情:rewrite ^/article/(d+).html$ /index.php?action=article&id=$1 last;
  2. 栏目列表:rewrite ^/category/(d+)/page-(d+).html$ /index.php?action=category&cid=$1&page=$2 last;
  3. 首页分页:rewrite ^/page-(d+).html$ /index.php?action=home&page=$1 last;

所有规则都放在同一个 location / { ... } 块里,按顺序匹配,靠前的优先生效。

更简洁写法:统一入口 + PATH_INFO 解析

如果你的 PHP 框架或程序支持 PATH_INFO(如 ThinkPHP、CodeIgniter),可把所有请求集中到一个入口,减少规则数量:

  1. 配置:rewrite ^/(.*).html$ /index.php/$1 last;
  2. 这样访问 /user/profile.html 实际执行 index.php/user/profile
  3. PHP 中通过 $_SERVER['PATH_INFO'] 或框架路由自动解析路径,无需每个链接单独写 rule
  4. 注意:需确保 PHP-FPM 配置启用 fastcgi_split_path_info 并正确传递 PATH_INFO

调试与验证要点

规则写完不能直接上线,必须验证是否按预期工作:

  1. 修改配置后执行 nginx -t 检查语法,再 nginx -s reload 生效
  2. 访问一个伪造的伪静态路径(如 /article/999.html),看是否返回 PHP 页面而非 404
  3. 打开 Nginx error log(error_log /path/to/error.log notice;),开启 notice 级别可看到 rewrite 执行日志
  4. 确认 PHP 脚本能正常接收参数——比如 $_GET['id'] 是否拿到值,而不是空或报错

热门栏目