署名:DEVDIY
标签:WordPress, 伪静态, 固定链接, Nginx, Apache, 404
原文/延伸阅读:https://devdiy.cn/wordpress/
典型现象:首页能打开,文章、分类、产品页一律 404;后台能进,数据库里内容也都在。
这种情况十有八九不是数据丢了,而是 WordPress 的固定链接格式和 Web 服务器的重写(rewrite)规则对不上 。首页走的是 index.php 默认入口,所以不受影响;内页的「漂亮链接」需要服务器把请求转给 index.php,规则一缺就 404。常见诱因:迁移服务器、换主机面板、改过 Nginx 配置、换主题后有人顺手动了伪静态。
下面按「先确认 → 再按服务器类型修 → 最后排插件」的顺序走。
0. 先用一条请求确认是不是重写问题
把任意一篇文章的 ID 找出来(后台文章列表悬停可见 post=123),访问:
https://你的域名/?p=123
- 能打开 → 内容在,问题基本锁定在重写规则;继续往下。
- 也打不开 → 不是伪静态问题,先查数据库连接、站点地址(
siteurl/home)或缓存。
1. 后台重新保存一次固定链接(1 分钟)
路径:设置 → 固定链接 → 不改任何选项,直接点「保存更改」。
这一步会刷新 WordPress 内部的 rewrite rules 缓存;在 Apache 下如果 .htaccess 可写,还会自动重写该文件。很多「迁移后 404」到这里就好了。没好,按服务器类型继续。
不确定是哪种服务器,可以看响应头:
bash
curl -sI https://你的域名/ | grep -i server
2A. Apache:检查 .htaccess 与 AllowOverride
站点根目录(与 wp-config.php 同级)的 .htaccess 应包含标准块:
apache
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
站点装在子目录(如 /blog/)时,RewriteBase 和最后一行要改成 /blog/ 和 /blog/index.php。
文件内容没问题仍 404,再查两处:
mod_rewrite是否启用:apache2ctl -M | grep rewrite,没有就a2enmod rewrite后重启。- 虚拟主机配置里该目录是否允许
.htaccess生效:
apache
<Directory /var/www/html>
AllowOverride All
</Directory>
AllowOverride None 时 .htaccess 会被完全忽略,这是迁移到新机器后最容易漏的一项。
2B. Nginx:location 里要有 try_files
Nginx 不读 .htaccess,后台「保存固定链接」对它不起作用,必须在 server 配置里写:
nginx
location / {
try_files $uri $uri/ /index.php?$args;
}
子目录安装:
nginx
location /blog/ {
try_files $uri $uri/ /blog/index.php?$args;
}
常见翻车点:
- 宝塔等面板的「伪静态」下拉选成了别的程序模板,或者换站后没重新选 WordPress;
- 有人为了「加速」加了自定义
location,把.html或带参数的请求提前return 404; - 改完没重载。先测后载:
bash
nginx -t && systemctl reload nginx
3. 规则正确仍 404:查插件与站点地址
- 重定向/SEO 类插件 :临时把
wp-content/plugins中相关插件目录改名停用,再刷新内页。 - 自定义文章类型:产品、案例等由插件或主题注册的类型,注册代码变动后需要再保存一次固定链接;也可用 WP-CLI:
bash
wp rewrite flush --hard
wp rewrite list | head
- 站点地址:设置 → 常规里的「WordPress 地址」和「站点地址」是否与当前域名、http/https 一致;不一致时会出现跳转后 404。
- CDN 或反向代理:如果前面挂了 CDN,先绕过 CDN 直连源站测试,确认 404 是源站产生的还是边缘缓存的旧结果。
4. 排查顺序小结
| 步骤 | 判断依据 | 处理 |
|---|---|---|
?p=ID 访问 |
能开 = 重写问题 | 继续下一步 |
| 保存固定链接 | 恢复 = 规则缓存过期 | 结束 |
| Apache | .htaccess + mod_rewrite + AllowOverride |
补齐后重启 |
| Nginx | try_files ... /index.php?$args |
nginx -t 后 reload |
| 仍 404 | 插件/自定义类型/站点地址/CDN | 逐项隔离 |
改服务器配置前,先把原文件复制一份(.htaccess.bak、xxx.conf.bak),出问题可以一秒回滚。不建议为这个问题重装 WordPress 或重新导入数据库------内容本身通常是好的。
------ DEVDIY,日常做 WordPress 外贸站、Shopify 外贸站和微信小程序的开发与排查,这篇是 WordPress 侧的常见问题记录。