Apache日志出现AH00124内部重定向超限错误排查求助
解决Apache AH00124内部重定向超限错误(Shop页面)
我帮你分析下这个问题——AH00124错误本质是重写规则或代码逻辑导致了循环重定向,哪怕你移除.htaccess后直接访问shop.php仍报错,大概率是两方面的问题:要么是.htaccess规则的顺序/条件有漏洞,要么是shop.php内部有无限跳转的代码逻辑。咱们一步步来解决:
先排查PHP代码(关键!)
既然你说移除.htaccess后直接访问shop.php?s=$var仍出现错误,那首先要排除PHP代码的问题:
- 打开
shop.php,搜索所有header("Location: ...")或header("Refresh: ...")的代码段 - 检查是否存在逻辑:比如当某个参数缺失时,跳转到
/shop/xxx路径,而这个路径又会被重写回shop.php,但参数依然缺失,形成循环 - 举个典型的错误例子:
这种情况下,if (empty($_GET['c'])) { header("Location: /shop/"); exit; }/shop/会被重写回shop.php(无c参数),然后代码又跳转回去,无限循环触发Apache的重定向次数限制。
修复.htaccess的重写规则
如果代码没问题,那就是.htaccess的规则顺序和条件导致了循环。你的规则存在几个冲突点,我帮你调整后的版本如下,每一步都加了注释:
RewriteEngine on # 1. HTTPS + WWW跳转 - 放在最顶端,确保所有请求先走HTTPS RewriteCond %{HTTPS} !on [OR] RewriteCond %{HTTP_HOST} !^www\. RewriteRule (.*) https://www.example.com%{REQUEST_URI} [L,R=301] # 2. 清理URL中的重复斜杠(比如//shop变成/shop) RewriteCond %{THE_REQUEST} // RewriteRule ^(.*)$ /$1 [L,R=301] # 3. home页面重写 RewriteRule ^home/?$ home.php [NC,L] # 4. 外部跳转:把动态参数URL转成静态路径(只对用户的原始请求生效) RewriteCond %{THE_REQUEST} /shop\?c=([^&\s]+)&s=([^&\s]+)&s2=([^&\s]+)&b=([^&\s]+) [NC] RewriteRule ^ shop/%1/%2/%3/%4? [L,R=302,NE] # 5. 内部重写:把静态路径转成动态参数 - 加条件避免和.php后缀规则冲突 RewriteCond %{REQUEST_URI} !\.php$ RewriteRule ^shop/([^/]+)/([^/]+)/([^/]+)/([^/]+)/?$ shop.php?c=$1&s=$2&s2=$3&b=$4 [L,QSA,B] RewriteCond %{REQUEST_URI} !\.php$ RewriteRule ^shop/([^/]+)/([^/]+)/([^/]+)/?$ shop.php?c=$1&s=$2&s2=$3 [L,QSA,B] RewriteCond %{REQUEST_URI} !\.php$ RewriteRule ^shop/([^/]+)/([^/]+)/?$ shop.php?c=$1&s=$2 [L,QSA,B] # 6. 最后处理.php后缀自动添加 - 排除shop路径,避免触发重写循环 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteCond %{REQUEST_URI} !^/shop/ RewriteRule ^(.*)$ $1.php [L]
关键调整点:
- 把shop相关的重写规则放在
.php后缀添加规则之前,避免静态路径被错误添加.php后缀 - 给shop的内部重写规则加
RewriteCond %{REQUEST_URI} !\.php$,防止已有的.php请求被重复重写 - 给
.php后缀规则加RewriteCond %{REQUEST_URI} !^/shop/,彻底排除shop路径的干扰
检查Apache主配置的细节
你的HTTP和SSL虚拟主机配置看起来没问题,但要注意两个点:
- 确保网站根目录的
<Directory>块允许.htaccess生效:
在SSL虚拟主机中添加(如果没有的话):
否则<Directory "/var/www/example.com/public_html"> AllowOverride All Require all granted </Directory>.htaccess的规则根本不会被Apache执行,可能导致其他异常。 - HTTP虚拟主机中的HTTPS跳转用了
[END]标志,这很好,会终止重写流程,避免和.htaccess的跳转规则冲突。
调试重写过程(可选)
如果还是有问题,可以开启Apache的重写日志来追踪每一步的重写:
- Apache 2.4及以上版本,在主配置中添加:
LogLevel alert rewrite:trace3 - 访问shop页面后,查看
/var/log/apache2/error.log(或指定的日志文件),就能看到重写的完整流程,找到循环的具体环节。
内容的提问来源于stack exchange,提问作者user3312792
相关产品推荐
相关产品推荐

