WordPress 固定链接与 REST API 404 问题复盘

一、问题现象

  • 网站:http://www.wowagent.top
  • 固定链接设置为数字型 /archives/123 后,所有自定义链接均无法访问,仅默认动态链接 ?p=123 可打开。
  • 后台修改固定链接时提示:.htaccess 文件无法写入。
  • 手动添加 .htaccess 规则后,文章编辑页面出现 REST API 404 错误:/wp-json/wp/v2/posts/54 无法访问。
  • 访问 /wp-json/ 根路由同样返回 404。

二、排查流程

1. 解决 .htaccess 写入权限

  • 查看文件权限:-rw-r--r--,所有者为 wp-user,组为 www-data。
  • Web 服务器以 www-data 身份运行,对 .htaccess 只有读权限,故无法自动更新。
  • 临时提升权限为 664(组可写):bashchmod 664 .htaccess
  • 后台保存固定链接,使 WordPress 写入规则,随后恢复为 644:bashchmod 644 .htaccess

2. 解决 REST API 404

  • 虽然固定链接规则已写入 .htaccess,但 /wp-json/ 仍返回 404。
  • 尝试备用访问 ?rest_route= 能返回 401(身份验证错误),说明 REST API 本身可用,但 URL 重写未生效。

3. 检查 Apache 重写模块

  • 执行 apache2ctl -M | grep rewrite,发现 mod_rewrite 未加载。
  • 启用模块并重启:bashsudo a2enmod rewrite sudo systemctl restart apache2
  • 再次检查,rewrite_module 已加载,但 /wp-json/ 依然 404。

4. 检查 AllowOverride 配置

  • 查看 Apache 站点配置 /etc/apache2/sites-available/000-default.conf。
  • 发现 <VirtualHost *:80> 内未设置 AllowOverride,Apache 默认会忽略 .htaccess 文件。
  • 在 <VirtualHost> 内添加:apache<Directory /var/www/html> AllowOverride All </Directory>
  • 重启 Apache 后,/wp-json/ 恢复正常,文章编辑功能恢复。

三、根本原因

  1. 权限问题:.htaccess 所属组无写权限,导致 WordPress 无法自动更新重写规则。
  2. 模块缺失:mod_rewrite 未启用,URL 重写功能不可用。
  3. 配置缺失:Apache 站点配置未授权 .htaccess 覆盖(AllowOverride 默认为 None),即使有规则也不生效。

四、最终解决方案

  1. 确保 mod_rewrite 启用:bashsudo a2enmod rewrite sudo systemctl restart apache2
  2. 配置 AllowOverride(编辑虚拟主机配置文件):apache<VirtualHost *:80> DocumentRoot /var/www/html <Directory /var/www/html> AllowOverride All </Directory> … </VirtualHost>重启 Apache。
  3. 修复 .htaccess 权限(若需自动写入):bashchown www-data:www-data .htaccess # 或临时 chmod 664 后恢复 644
  4. 验证:
    • 访问 /wp-json/ 返回 JSON 数据。
    • 固定链接 /archives/123 正常显示文章。

五、经验总结

  • Apache 环境下,WordPress 固定链接和 REST API 同时失效时,应重点检查:
    • mod_rewrite 是否加载
    • .htaccess 文件是否存在且规则正确
    • 虚拟主机配置中 AllowOverride All 是否设定
  • 使用 ?rest_route= 参数可快速判断是路由重写问题还是 REST API 本身问题。
  • 修改配置后务必重启服务。

发表回复