You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress多站点:访问已删除站点不存在文件时触发500错误

解决WordPress子目录多站点访问已删除站点资源的500重定向循环错误

问题场景

子目录结构的WordPress多站点中:

  • 访问普通不存在路径(如/blahblah/或/blahblah/1.jpg)能正常返回404
  • 访问已删除站点下的资源路径(如/blahblah/wp-content/uploads/sites/1/1.jpg)时触发500错误
  • Apache日志提示:Request exceeded the limit of 10 internal redirects due to probable configuration error.
  • 使用的是WordPress官方提供的标准.htaccess规则

问题原因

官方默认规则中,针对wp-content/wp-admin/wp-includes的重写逻辑会剥离子目录前缀(例如把/blahblah/wp-content/xxx重写成/wp-content/xxx)。但如果重写后的目标文件/目录也不存在,规则会重复触发循环——因为原规则的文件/目录存在性检查仅在第一次请求匹配前执行,重写后的请求没有再次校验是否存在,最终导致Apache达到重定向次数限制,抛出500错误。

解决方案

修改.htaccess规则,在处理完wp-content等路径的重写后,新增对目标文件/目录的存在性检查,阻止循环触发。修改后的完整规则如下:

# BEGIN WordPress

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    
# add a trailing slash to /wp-admin
    RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
    
    # 检查原始请求的文件/目录是否存在,存在则直接返回
    RewriteCond %{REQUEST_FILENAME} -f [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^ - [L]
    
    # 重写子目录下的wp-content/wp-admin/wp-includes路径
    RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
    # 新增:若重写后的目标不存在,停止重写流程
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^wp-(content|admin|includes).* - [L]
    
    # 重写子目录下的PHP文件
    RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
    
    # 其余请求转发到index.php处理
    RewriteRule . index.php [L]
</IfModule>

# END WordPress

修改说明

  • 新增的规则会在重写wp-content等路径后,检查目标路径是否不存在。如果确实不存在,就停止当前重写流程,避免进入循环。
  • 此时请求会继续执行到最后一条规则,转发到index.php,由WordPress返回标准的404页面,而非触发500错误。

内容的提问来源于stack exchange,提问作者IUWPDEV

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 20:50:06