.htaccess外部与内部重写冲突:URL重定向触发过多重定向错误
解决.htaccess URL重写时的无限重定向问题
我来帮你分析下问题所在,你遇到的「Too many redirects」错误本质是规则顺序和匹配逻辑的循环触发导致的:
你的现有规则是先处理内部重写(把/page/xxx转成index.php?p=xxx),再处理外部重定向(把?p=xxx转成/page/xxx)。但当用户访问?p=page1时,流程变成了:
- 触发重定向规则,把URL跳转到
/page/page1 - 内部重写规则把
/page/page1转成index.php?p=page1 - 这时候服务器内部处理的请求又带上了
p=page1的查询字符串,会再次触发第二步的重定向规则,无限循环下去
修正后的.htaccess配置
# 先处理外部重定向:仅当请求不是/page/开头时,才把?p=xxx跳转到/page/xxx RewriteCond %{REQUEST_URI} !^/page/ [NC] RewriteCond %{QUERY_STRING} ^p=(.*)$ [NC] RewriteRule ^ /page/%1? [R=301,L,NE,QSD,NC] # 再处理内部重写:把/page/xxx转成index.php?p=xxx RewriteRule ^page/(.*)$ index.php?p=$1 [L,QSA,NC]
关键调整点说明
- 规则顺序调换:先做外部重定向,再做内部重写,避免重写后的请求再次触发重定向
- 新增排除条件:
RewriteCond %{REQUEST_URI} !^/page/ [NC]确保已经是/page/路径的请求不会进入重定向规则,从根源上切断循环 - 简化内部重写条件:原来的
RewriteCond %{REQUEST_URI} /page/(.*)其实是多余的,因为RewriteRule本身已经匹配了^page/(.*)$路径,直接保留规则体即可
这样调整后,不管用户访问?p=page1还是/page/page1,都能正常工作,不会出现无限重定向的问题了。
内容的提问来源于stack exchange,提问作者Jake Sterling
相关产品推荐
相关产品推荐

