发布时间:2026-09-27 05:01 更新时间:2026-09-27 05:01 阅读量:0
用宝塔面板装 WordPress 时,安装向导那一步一切正常,首页和后台都能打开,但只要把「设置 → 固定链接」从默认的朴素模式改成「文章名」,前台文章页立刻变成 404,首页却依旧正常。这个现象很典型:PHP 和数据库没问题,问题出在 Nginx 没有把 /2026/09/hello-world/ 这类不含真实文件名的请求,正确地交给 index.php 处理。下面按「先确认规则有没有被加载,再看 try_files 走了哪条分支」的顺序来排查。
WordPress 的固定链接依赖两段配合:一是 Nginx 把不存在的路径重写或转发给 index.php,二是 WordPress 自己根据 rewrite 规则解析出对应的文章。宝塔面板里点「网站 → 设置 → 伪静态」,选择 wordpress 后,实际是把一段规则写进站点配置文件。默认情况下,宝塔的 WordPress 伪静态内容是:
location / {
try_files $uri $uri/ /index.php?$args;
}
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
这段规则的含义是:请求先按真实文件($uri)找,再按目录($uri/)找,都没命中才交给 /index.php 并带上原始查询参数。所以文章页 404,通常是三种情况之一:规则根本没被 include 进当前 server 块;try_files 命中了某个不该命中的文件或目录;或者规则生效了但 WordPress 侧 permalink 结构与 rewrite 不一致。
先在服务器上确认规则有没有真的加载。宝塔的站点配置一般在 /www/server/panel/vhost/nginx/ 下,以域名命名。用下面命令查看该文件里 include 了哪个伪静态文件,以及对应文件是否存在:
# 查看站点配置中的 include 与 location 段落
nginx -T 2>/dev/null | grep -n -A3 -B3 "try_files"
确认伪静态文件存在且内容正确
ls -l /www/server/panel/vhost/rewrite/
cat /www/server/panel/vhost/rewrite/你的域名.conf
语法检查后再重载
nginx -t && nginx -s reload
如果 nginx -T 的输出里看不到 try_files,说明伪静态没保存成功,或者保存到了别的站点文件里。宝塔里切换伪静态后建议手动点一次「保存」,再执行 nginx -t 确认没有报错,最后 reload。只改文件不 reload,规则不会生效,这一点和「宝塔面板Nginx伪静态改了不生效」是同一类问题。
如果规则确认已加载,但文章页仍 404,就要看 try_files 到底命中了什么。常见原因是站点根目录下存在与伪静态路径同名的真实目录,比如 WordPress 装了多站点或某些插件生成了 /category/ 之类的物理目录,$uri/ 这一项就会命中目录并尝试走目录索引,结果找不到 index 文件而 404。此时可以临时把调试信息打开,在 server 块里加一行,观察请求实际落到哪里:
# 临时调试用,排查完记得删掉
location / {
add_header X-Debug-Uri "$uri";
try_files $uri $uri/ /index.php?$args;
}
再用 curl 看响应头,确认请求进入的是哪个 location:
curl -I -H "Host: 你的域名" http://127.0.0.1/2026/09/hello-world/
另一个高频坑是 root 与 alias 混用。WordPress 站点一般用 root 指向网站根目录;如果误用了 alias,try_files 的路径拼接方式会变,$uri 与 root 叠加后可能指向不存在的路径,表现为首页正常、内页全 404。宝塔新建站点默认用 root,若你手工改过配置,建议核对一遍。此外还要注意:开了 CDN 或反代时,回源 Host 不对也会让 Nginx 匹配到默认站点,从而加载了另一个站点的伪静态,表现为「规则明明写了却不生效」。
还有一种情况是规则对了但 WordPress 侧没刷新。改固定链接后,WordPress 会写入 rewrite 规则,如果站点地址(siteurl/home)与实际访问域名不一致,生成的链接和服务器收到的路径就会对不上。可以进后台「设置 → 固定链接」直接再点一次保存,让规则重建;确认无误前不要用插件批量改结构。相关救援思路可参考站内关于改域名后打不开的排查方法。
配置调整后不要只看浏览器,用状态码和日志确认。文章页应返回 200,不存在的地址应返回 404 而不是 500 或 403:
# 检查首页与文章页状态码
curl -o /dev/null -s -w "%{http_code} %{url_effective}\n" http://你的域名/
curl -o /dev/null -s -w "%{http_code} %{url_effective}\n" http://你的域名/2026/09/hello-world/
若返回 404,看错误日志定位是哪个 location 处理的
tail -n 50 /www/wwwlogs/你的域名.error.log
如果日志里显示请求根本没进 index.php,回到 try_files 那一行;如果进了 index.php 却仍 404,多半是 permalink 结构与 rewrite 不匹配,或者插件接管了 rewrite 规则,可临时停用固定链接相关插件再试。修好后建议顺手做两件事:一是把固定链接结构固定下来,后续换结构时用 301 把旧链接指过去,避免收录流失;二是把这个站点的伪静态文件备份一份,迁移或换服务器时直接复用,减少重复排查。
整体思路可以记成一句话:先确认规则加载(nginx -T 能看到 try_files),再确认请求落点(curl 看状态码、error.log 看路径),最后回到 WordPress 侧核对 permalink。三步走下来,固定链接 404 基本都能定位到具体环节,而不是反复重装或盲改配置。
| 📑 | 📅 |
|---|---|
| 网站301与302混用导致权重分散:跳转类型选择与生效验证 | 2026-09-27 |
| WordPress后台被暴力撞库告警:登录限速与日志加固 | 2026-09-26 |
| 域名下PC站与m站SEO冲突:canonical、自适应与UA跳转取舍 | 2026-09-26 |
| 宝塔面板升级后网站打不开:PHP扩展、Nginx配置与面板服务逐项回滚排查 | 2026-09-26 |
| WordPress中文名附件变乱码或404:编码链路排查 | 2026-09-26 |
| HTTPS混合内容批量修复:控制台与curl定位http资源 | 2026-09-27 |
| MySQL被OOM Kill排查:swap、buffer pool与监控取舍 | 2026-09-27 |
| Nginx resolver 域名解析缓存:反代上游换 IP 后仍走旧地址的排查 | 2026-09-27 |
| 宝塔面板日志被CDN节点IP填满:log_format与real_ip联动调整 | 2026-09-27 |
| WordPress 数据库表前缀修改实战:从 wp-config 到 SQL 批量改名 | 2026-09-27 |