文章资讯 / 云服务器 / Nginx伪静态配置:WordPress和ThinkPHP框架的rewrite规则代码示例

Nginx伪静态配置:WordPress和ThinkPHP框架的rewrite规则代码示例

发布时间: 分类:云服务器 作者:188mi 来源:互联网 阅读:99

Nginx 本身不做伪静态,它靠 rewrite 与 try_files 把动态地址改写成静态形式。WordPress、ThinkPHP 的 rewrite 规则写法不同,下面按常见疑问逐个说清。

为什么 Nginx 伪静态不能只写一条 rewrite?

很多人以为伪静态就是把 .php?id=1 换成 /1.html,其实 Nginx 只负责两件事,弄清分工就不会写错。

  • URL 重写:把 /article/123.html 这类地址翻译成 Nginx 能识别的请求路径或参数,由 rewrite 或 location 正则完成。
  • 请求转发:把翻译后的请求交给 PHP-FPM,由 fastcgi_pass 完成,这一步与伪静态形式无关。

所以伪静态规则写得对不对,判断标准是"PHP 能否收到正确的路由参数",而不是浏览器地址栏好不好看。第二条要记住的是 rewrite 与 try_files 的顺序:Nginx 在 location 内先执行 rewrite,再判断 try_files,写反了会出现死循环或 404。

WordPress 的伪静态规则该怎么写?

WordPress 的固定链接依赖 index.php 做路由分发,Nginx 场景推荐用 try_files,比逐条 rewrite 更稳。

在站点的 server 块内,location / 段写:

location / {
    try_files $uri $uri/ /index.php?$args;
}

含义按顺序是:先找同名静态文件,再找同名目录,都没有就把请求交给 index.php 并带上原始参数。只要 PHP-FPM 配置正常,后台"设置 → 固定链接"选好结构后,文章页、分类页、分页都会自动生效。

两个易错点:

  • $args 不能省,否则分页 ?paged=2、搜索参数会丢。
  • 若站点装在子目录(如 /blog),try_files 末段要写成 /blog/index.php?$args,否则会跳到主站首页。

若服务器没有开启 PATHINFO,或你希望 URL 里带 .html 后缀,可改用 rewrite:

location / {
    if (!-e $request_filename) {
        rewrite ^/(.*)$ /index.php/$1 last;
    }
}

if 在 location 里能用但不建议复杂嵌套,简单判断文件不存在即可。

ThinkPHP 的 rewrite 规则和 WordPress 差在哪?

差异主要有两处:一是 ThinkPHP 有入口文件概念,二是它对 PATHINFO 的依赖更强。

单一入口的常见写法:

location / {
    if (!-e $request_filename) {
        rewrite ^(.*)$ /index.php?s=$1 last;
    }
}

?s= 是兼容模式参数,对应 index.php?s=/模块/控制器/操作。新版框架默认走 PATHINFO,可以改成:

location / {
    try_files $uri $uri/ /index.php?s=$uri&$args;
}

需要提醒的几点:

  • try_files 里加了 $args,GET 参数才不会丢。
  • 隐藏入口文件后,Index 模块的访问入口会变化,后台地址要同步改,否则登不进去。
  • 若出现"无法加载控制器",先确认 fastcgi.conf 中 PATHINFO 相关变量是否已传递,通常需要在 fastcgi_params 后加载框架自带的配置文件。
  • 规则里的 last 表示重写后重新匹配 location,break 表示在本段内终止,二者混用容易生成 500。

改完怎么验证伪静态是否真的生效?

配置改完不要直接刷新页面就下结论,按下面几步确认。

第一步,检查语法再重载,避免整站挂掉:

nginx -t
nginx -s reload

第二步,用命令行看返回码和跳转路径,比肉眼判断可靠:

curl -I https://example.com/article/123.html
curl -I https://example.com/index.php

重点看 HTTP 状态码是否为 200、有无意外的 301/302 循环。若两个地址返回内容一致,说明伪静态已生效;若带参数的动态地址仍能直接访问,需要额外加 301 或 location 拦截。

第三步,登录网站后台看看固定链接或路由缓存是否要重建,WordPress 保存一次固定链接即可刷新规则,框架类站点清一次路由缓存。

第四步,出现 404 时按三层排查:先看 nginx -t 是否报错,再看 PHP-FPM 的 error log,最后看框架自身的日志。绝大多数伪静态失效不是规则写错,而是 try_files 末段路径写错或 $args 丢了。

配置前还要确认哪些前提条件?

规则贴上去之前,先把这几项确认清楚,能省掉大半返工。

  • Nginx 是否已加载 PHP 处理段,fastcgi_pass 指向的 socket 或端口是否与 PHP-FPM 一致。
  • 服务器是否允许 PATHINFO,宝塔、AMH 这类面板默认关闭,需要在站点设置里单独开启。
  • 伪静态文件路径要和站点根目录对应,子目录站点不能照抄根目录规则。
  • 伪静态与真实目录同名时会冲突,优先让 try_files 判断 $uri,真实存在的文件和目录不被重写。
  • 规则改动建议先在测试站验证,再同步到生产环境。

相关工具与阅读