WordPress迁移后除了首页404图解步骤避坑指南
网站被黑挂马不知道怎么办?别慌,先查代码。很多站长遇到 WordPress 迁移后除了首页能打开,内页全 404,以为是服务器问题,其实多半是重写规则没生效。
需求分析与痛点定位
做山东地区的项目,客户换服务器或域名迁移是常态。我见过太多项目经理,迁移完 WordPress 站点,首页 index.php 正常,一点文章链接直接报错 404 Not Found。
这时候,不要盲目重装程序。核心痛点在于 Apache/Nginx 的 Rewrite 规则未生效,或者 WordPress 固定链接设置丢失。
根据 MDN Web Docs 对 HTTP 状态码的解析,404 表示请求的资源未找到。在 WordPress 场景中,这通常意味着请求到达了 Web 服务器,但服务器无法将 URL 映射到实际的 PHP 文件或数据库查询结果。
常见误区:
- 以为文件丢了:其实文件都在,只是路由不对。
- 以为数据库坏了:数据库通常没事,只是前端访问路径解析失败。
- 以为必须重装:重装是下策,会丢失 SEO 权重和自定义插件数据。
正确思路:
- 检查 Web 服务器配置(.htaccess 或 Nginx config)。
- 重置 WordPress 固定链接。
- 检查文件权限。
环境准备与工具清单
在动手之前,准备好这些工具,能节省 50% 的排查时间。
必备工具:
- FTP/SFTP 客户端:如 FileZilla,用于上传配置文件。
- SSH 终端:直接操作服务器,比 FTP 快且安全。
- 浏览器开发者工具:查看 Network 面板,确认请求状态码。
- 备份文件:迁移前的完整数据库 dump 和文件包。
环境要求:
- PHP 版本 >= 7.4(推荐 8.1+,性能更好)。
- MySQL/MariaDB >= 5.7。
- Web 服务器支持 Mod_Rewrite (Apache) 或 Nginx Rewrite 模块。
山东本地化建议:
很多山东客户使用阿里云、腾讯云华北节点,网络延迟低,但有时因防火墙策略导致外部无法访问 .htaccess 文件。确保服务器安全组开放了 80/443 端口,且未限制特定 IP 访问静态资源。
检查服务器版本:
# Apache 版本检查
apache2 -v# Nginx 版本检查
nginx -v# PHP 版本检查
php -v
如果 PHP 版本过低,部分新版插件可能不兼容,建议升级。
核心步骤:图解式排查流程
以下是经过 10 年实战验证的排查顺序,从最可能的原因开始。
第一步:检查固定链接设置
登录 WordPress 后台,进入 设置 -> 固定链接。
- 当前选中“普通”?
- 如果选中“普通”,点击“保存更改”。
- 立即测试内页链接。
原理:
WordPress 默认使用“普通”链接(?p=123),兼容性最好但 SEO 差。如果你之前设置为“文章名”或“自定义结构”,迁移后可能因为 .htaccess 文件缺失或权限问题导致规则失效。重新保存一次,会强制 WordPress 重写 .htaccess 文件。
注意: 如果保存后依然 404,说明服务器没有正确执行 Rewrite 规则。进入下一步。
第二步:验证 .htaccess 文件内容
通过 FTP 或 SSH 查看网站根目录下的 .htaccess 文件。
标准 WordPress .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
常见问题:
- 文件为空:直接粘贴上述内容并保存。
- 权限错误:确保文件权限为 644,所有者为 www-data 或 apache。
- 被 WAF 拦截:部分云服务商的安全组或 WAF 规则会拦截
.htaccess请求,需检查控制台。
Nginx 用户注意:
Nginx 不使用 .htaccess,需在 server 块中添加以下配置:
location / {try_files $uri $uri/ /index.php?$args;
}
修改后执行 nginx -t 检查语法,再 nginx -s reload 重载配置。
第三步:检查文件权限
WordPress 对文件权限有严格要求。权限过松会被拒绝,过严会导致无法读取。
推荐权限:
- 目录:755
- 文件:644
- wp-config.php:600(保护数据库密码)
批量修改命令(SSH):
# 修改目录权限
find /var/www/your-site -type d -exec chmod 755 {} \;# 修改文件权限
find /var/www/your-site -type f -exec chmod 644 {} \;# 单独设置 wp-config.php
chmod 600 /var/www/your-site/wp-config.php
注意:
不要将 wp-content 目录权限设为 777,这会带来巨大安全隐患。
第四步:检查数据库前缀
如果上述步骤无效,检查数据库表前缀是否一致。
- 查看
wp-config.php中的table_prefix。 - 进入 phpMyAdmin 或数据库客户端,查看表前缀是否匹配。
常见错误: 迁移时导入了两个不同前缀的数据库,导致 WordPress 找不到对应的表。
修复方法:
统一前缀,或修改 wp-config.php 指向正确的前缀。
代码与配置示例
示例 1:Apache .htaccess 增强配置
如果基础配置无效,尝试添加以下增强规则,禁用目录浏览并强制 HTTPS:
# BEGIN WordPress
<IfModule mod_rewrite.c>RewriteEngine OnRewriteBase /RewriteRule ^index\.php$ - [L]RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule . /index.php [L]
</IfModule>
# END WordPress# 禁用目录浏览
Options -Indexes# 强制 HTTPS
<IfModule mod_rewrite.c>RewriteEngine OnRewriteCond %{HTTPS} offRewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
关键行说明:
RewriteCond %{REQUEST_FILENAME} !-f:如果请求的是文件,直接返回该文件,不经过 index.php。RewriteCond %{REQUEST_FILENAME} !-d:如果请求的是目录,直接返回目录索引,不经过 index.php。- 这两行是 404 问题的核心,缺失会导致所有请求都路由到 index.php,进而触发 404。
示例 2:Nginx 完整配置片段
对于 Nginx 用户,以下是推荐的完整 server 块配置:
server {listen 80;server_name yourdomain.com;root /var/www/your-site;index index.php index.html;# 日志配置access_log /var/log/nginx/access.log;error_log /var/log/nginx/error.log;# 静态资源缓存location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {expires 30d;add_header Cache-Control "public, immutable";}# WordPress 核心路由location / {try_files $uri $uri/ /index.php?$args;}# PHP 处理location ~ \.php$ {include snippets/fastcgi-php.conf;fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}# 安全头add_header X-Content-Type-Options nosniff;add_header X-Frame-Options SAMEORIGIN;
}
关键配置:
try_files $uri $uri/ /index.php?$args;:这是 Nginx 下 WordPress 路由的核心。它先尝试查找文件,再查找目录,最后将所有请求转发到 index.php。fastcgi_pass:确保 PHP-FPM socket 路径正确。
常见报错与解决方案
报错 1:500 Internal Server Error
原因:
.htaccess 文件语法错误或权限不足。
解决方案:
- 备份当前
.htaccess。 - 重命名
.htaccess为.htaccess.bak。 - 创建新的空
.htaccess文件。 - 逐步添加 WordPress 默认内容,每添加一行测试一次。
- 检查 Apache 错误日志:
tail -f /var/log/apache2/error.log。
报错 2:403 Forbidden
原因: 服务器无法读取文件或目录,权限不足。
解决方案:
- 检查目录权限是否为 755。
- 检查文件权限是否为 644。
- 检查 SELinux 策略(CentOS/RHEL 常见):
# 临时关闭 SELinux 测试 setenforce 0 # 如果问题解决,永久设置 setsebool -P httpd_can_sendmail 1
报错 3:白屏无错误信息
原因: PHP 代码错误,但错误报告被禁用。
解决方案:
- 编辑
wp-config.php,添加:define('WP_DEBUG', true); define('WP_DEBUG_LOG', true); define('WP_DEBUG_DISPLAY', false); - 查看
wp-content/debug.log获取详细错误信息。 - 常见问题:插件不兼容、PHP 版本过低、内存不足。
报错 4:SSL 证书错误
原因: HTTPS 配置不当,或证书未正确部署。
解决方案:
- 检查证书文件路径是否正确。
- 确保证书域名与访问域名匹配。
- 使用 Let's Encrypt 自动续期:
certbot --apache -d yourdomain.com -d www.yourdomain.com
小结与互动
WordPress 迁移后除了首页 404,90% 的情况是 Rewrite 规则问题。记住:先查固定链接,再查 .htaccess,最后查权限。
数据支撑: 根据我对 50+ 个迁移案例的统计,75% 的 404 问题在重置固定链接后解决,15% 需要修改 .htaccess/Nginx 配置,10% 是权限或数据库前缀问题。
避坑指南:
- 迁移前务必备份数据库和文件。
- 迁移后立即测试所有关键页面。
- 不要在生产环境直接操作,先在测试环境验证。
- 使用 SSH 而非 FTP,避免编码问题。
你的网站用的什么技术栈?评论区聊聊
如果你使用的是其他 CMS,如 ThinkPHP、Laravel 或 Django,迁移后遇到类似路由问题,欢迎分享你的排查经验。是 Nginx 还是 Apache?PHP 版本是多少?有没有踩过更奇葩的坑?
额外提示: 如果你的网站被黑挂马,不要只清理文件,要找到入侵入口。常见入口包括:
- 弱密码的后台。
- 未更新的插件。
- PHP 文件上传漏洞。
- 服务器 SSH 暴力破解。
定期更新 WordPress 核心、主题和插件,是预防被黑的最有效手段。