给一个 WordPress 站配伪静态,首页正常,所有内页 404。
这种事我遇到不下五次,每次都是同一个原因。
记一下排查顺序,省得下次再从头想。
先确认是伪静态的问题
现象:首页 https://www.example.com/ 正常,点任何一篇文章变成 404。
直接用 curl 看返回码:
curl -I https://www.example.com/123.html
如果是 404,再看一下这个 404 是谁返回的:nginx 的还是 WordPress 的。
nginx 的 404 页面很简陋,一行 404 Not Found,下面是 nginx 字样。
WordPress 的 404 会带主题样式,是一整页。
这两个区别很重要:
- nginx 的 404 → 请求根本没进 PHP,伪静态没配
- WordPress 的 404 → 进了 PHP,但路由匹配不上,多半是固定链接规则的问题
nginx 的 404:加一行就行
WordPress 需要把所有不存在的路径都交给 index.php 处理。nginx 里对应的规则是:
location / {
try_files $uri $uri/ /index.php?$args;
}
这一行的意思是:先找同名文件,找不到就找同名目录,还找不到就把请求转给 index.php,参数原样带过去。
?$args 不能省。省了之后带参数的页面会丢参数,比如分页 ?page=2 会变成第一页。
宝塔面板里有个"伪静态"按钮,选 WordPress,它会自动写入这一段。问题是很多人迁移服务器之后忘了点这个按钮。
进了 PHP 还是 404:看固定链接
如果 nginx 规则没问题,但内页还是 404,去后台看"设置 → 固定链接"。
有时候从别的站迁移过来,.htaccess 或者 nginx 规则带过来了,但 wp_options 里的 rewrite_rules 是空的——WordPress 靠这个字段把 URL 映射到查询参数。
解决办法很简单:进固定链接页面,什么都不改,直接点一次"保存更改"。WordPress 会重新生成规则。
我遇到过一次更怪的:保存了也没用,因为主题里注册了一个自定义文章类型,注册代码在 after_setup_theme 之前执行,规则生成时这个类型还不存在。把注册代码挂到 init 钩子上就好了。
几个容易踩的细节
location 的优先级。
nginx 匹配顺序是:= 精确 → ^~ 前缀且不再匹配正则 → 正则 ~ 和 ~* → 普通前缀。
如果你写了:
location ~* \.(jpg|png|css|js)$ {
expires 30d;
}
这条正则的优先级高于普通前缀的 location /。所以图片能正常加载,但页面走的是 location / 里的 try_files。逻辑上没问题。
但如果你写成:
location / {
return 404;
}
那就全站 404,包括 try_files——因为你没写 try_files。
rewrite 和 try_files 别混用。
有些老教程写的是这种:
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?$1 last;
}
能用,但 if 在 nginx 里是"evil if",容易出玄学问题。try_files 是官方推荐写法,效率也更高。
子目录安装。
如果 WordPress 装在 /blog/ 这样的子目录,规则要改:
location /blog/ {
try_files $uri $uri/ /blog/index.php?$args;
}
路径少写一个 /blog/,就会 404。
排查顺序总结
下次再遇到,按这个走:
curl -I看 404 是 nginx 还是 WordPress 返回的- nginx 的 → 检查
try_files有没有写 - WordPress 的 → 后台固定链接点一次保存
- 还不行 → 看
/www/wwwlogs/站点.error.log,里面会有具体哪一行配置出错 - 最后才怀疑主题或插件
我处理过的这类问题,八成在第一步就能定位。
伪静态这事没有玄学。404 是 nginx 给的还是 PHP 给的,一看就知道问题在哪一层。
1、本站所有资源均收集于互联网,分享目的仅限学习与参考。如有侵权,请联系 1685698671@qq.com 及时删除!
2、本站资源不保证完整性和安全性,下载后请自行检测。使用过程中出现的任何问题均与本站无关,敬请自行处理。
3、本站资源仅限个人学习研究使用,严禁用于任何违法违纪用途。因使用者违规使用产生的一切后果,由使用者自行承担,本站不承担任何责任。


评论(0)