本文约 2,855 字,预计阅读 8 分钟。文中命令与配置均经过实测,可直接参考执行。
引言
迁移完成后你打开新站,首页显示得好好的,logo、导航、样式都在,可一点导航栏里的「关于我们」「分类文章」,浏览器就告诉你「此页面找不到」,或者干脆一片空白。这种「首页正常、内页全挂」的故障,比整站打不开更容易被误判——很多人以为是程序坏了或者数据库导入不全,结果折腾半天重装,问题依旧。
其实这几乎百分之百是「伪静态没生效」造成的。首页是真实存在的 index.php,不需要任何规则就能访问;而内页靠的是把漂亮网址交给 WordPress 解析,这中间必须有 .htaccess(Apache)或者 try_files(Nginx)在起作用。迁移时最容易漏掉的,恰恰就是那个点号开头、平时看不见的 .htaccess 文件。下面把判断依据和两种服务器的具体配置一次讲清。
故障原因分析
.htaccess文件没被迁移。 这个文件是隐藏文件,很多压缩打包工具和 FTP 客户端默认会略过它。旧站靠它实现内页跳转,新站少了它,内页请求自然找不到实体文件而失败。
- Apache 的 mod_rewrite 模块没启用。 就算
.htaccess放对了位置,如果服务器没开 Rewrite 模块,里面的规则也不会被执行。部分默认关闭该模块的环境(常见于自建 Apache)就属于这种情况。
- Nginx 站点配置缺 try_files。 Nginx 不认
.htaccess,必须在server {}里用try_files指定「找不到文件就交给 index.php」。宝塔新建站点时如果没有套用 WordPress 伪静态模板,就会漏掉这段。
- AllowOverride 被设为 None。 Apache 默认可能不允许
.htaccess覆盖服务器配置,此时文件在也没用,需要把目录的AllowOverride改为All。
- 固定链接规则库为空。 迁移时数据库部分表导入失败,
wp_options里的rewrite_rules为空,即使服务器配置正确,WordPress 也不知道该怎么解析。
分步解决方案
先看服务器类型:宝塔面板默认是 Nginx,cPanel 和大部分虚拟主机是 Apache。分不清的话,看网站根目录有没有 .htaccess 文件——有通常就是 Apache。
方法一(Apache):补齐 .htaccess 并确认模块
第一步,在网站根目录建立 .htaccess,写入标准规则:
# 文件路径:网站根目录/.htaccess
# 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
第二步,确认 Rewrite 模块开启。如果是宝塔的 Apache 环境,在「软件商店 → Apache → 设置 → 配置修改」里搜索 mod_rewrite,确保它没有被注释。如果是自建 Apache,用命令检查:
# 查看已加载模块,出现 rewrite_module 即表示已启用
apachectl -M | grep rewrite
第三步(自建服务器),打开 Apache 主配置,把网站目录的 AllowOverride None 改成 AllowOverride All:
<Directory /www/wwwroot/你的站点>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
改完重启 Apache 生效。
方法二(Nginx):配置 try_files 伪静态
在宝塔里点站点「设置 → 伪静态」,直接选 wordpress 模板即可。手动配置就是下面这段:
location / {
try_files $uri $uri/ /index.php?$args;
}
改完在宝塔里重载 Nginx,或命令行执行:
nginx -t && nginx -s reload
方法三:重建固定链接并清缓存
服务器配置修好后,回后台「设置 → 固定链接」,把结构切到「朴素」保存,再切回「文章名」保存,强制刷新规则。随后清除 WordPress 缓存插件(如 WP Super Cache、W3 Total Cache)的缓存,否则前台读到的还是旧的 404 缓存。在动手之前,也可以先用一个简单办法判断服务器类型:访问一个肯定不存在的地址,比如 你的域名/abc123,如果返回的是 WordPress 主题的 404 页面,说明伪静态其实是通的,那问题就在固定链接规则库或缓存;如果返回的是服务器自带的「404 Not Found」纯文本页,就说明 rewrite 规则确实没生效,需要按上面的方法补配置。这个判断能帮你少走许多弯路。
常见踩坑点
- 只放规则却忘了重启服务。 Apache、Nginx 改配置后必须重载或重启,否则新规则不生效,你会误以为方法没用。
.htaccess用文本编辑器存成了 HTML。 保存时若多出.txt后缀或编码带 BOM,会导致 Apache 500,命名必须精确为.htaccess。- Nginx 里塞了 .htaccess。 环境搞反是新手最常犯的错,Nginx 完全不读
.htaccess,放进去也是摆设。 - 插件缓存没清。 修好规则后前台仍 404,八成是缓存插件或 CDN 缓存还留着旧结果,清一次再试。
- 子目录站点规则写错。 装在
/blog/下的站,RewriteBase和try_files都要带子目录,否则内页全断。 - 随手删了
.htaccess判断问题。 排查时可以临时删掉它,但修复后一定要放回来,也别让插件重复写入导致规则冲突。
总结
首页正常、内页全打不开,说明 WordPress 程序和数据库其实都没问题,病根在服务器这一层的伪静态规则上。Apache 环境就补齐 .htaccess 并确保 Rewrite 模块与 AllowOverride 正常,Nginx 环境就配好 try_files,最后回后台重存一次固定链接并清理缓存。迁移后内页打不开这类问题,只要顺着「文件有没有 → 模块开没开 → 规则对不对 → 缓存清没清」这条线走,基本不会走弯路。养成迁移后第一时间检查隐藏文件的习惯,能帮你省下大量排查时间。
