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
相关产品推荐
相关产品推荐

