Nginx伪静态配置:WordPress和ThinkPHP框架的rewrite规则代码示例
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,真实存在的文件和目录不被重写。 - 规则改动建议先在测试站验证,再同步到生产环境。