一、问题现象
- 网站:
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/ 恢复正常,文章编辑功能恢复。
三、根本原因
- 权限问题:
.htaccess 所属组无写权限,导致 WordPress 无法自动更新重写规则。
- 模块缺失:
mod_rewrite 未启用,URL 重写功能不可用。
- 配置缺失:Apache 站点配置未授权
.htaccess 覆盖(AllowOverride 默认为 None),即使有规则也不生效。
四、最终解决方案
- 确保
mod_rewrite 启用:bashsudo a2enmod rewrite sudo systemctl restart apache2
- 配置 AllowOverride(编辑虚拟主机配置文件):apache<VirtualHost *:80> DocumentRoot /var/www/html <Directory /var/www/html> AllowOverride All </Directory> … </VirtualHost>重启 Apache。
- 修复 .htaccess 权限(若需自动写入):bashchown www-data:www-data .htaccess # 或临时 chmod 664 后恢复 644
- 验证:
- 访问
/wp-json/ 返回 JSON 数据。
- 固定链接
/archives/123 正常显示文章。
五、经验总结
- Apache 环境下,WordPress 固定链接和 REST API 同时失效时,应重点检查:
mod_rewrite 是否加载
.htaccess 文件是否存在且规则正确
- 虚拟主机配置中
AllowOverride All 是否设定
- 使用
?rest_route= 参数可快速判断是路由重写问题还是 REST API 本身问题。
- 修改配置后务必重启服务。