URL重写规则问题:兼容非ASCII字符后出现重定向循环
重定向循环原因分析与优化方案
错误原因
- 原规则的安全边界:原规则中的
[\w()-]仅匹配字母、数字、下划线、括号和减号,不包含点号(.),因此实际存在的rewrite.php文件不会被规则匹配,不会触发重复重写。 - 修改后规则的两个致命问题:
- 范围失控:
[-0-9a-zA-Z\W]+逻辑冗余,[-0-9a-zA-Z]是单词字符子集,\W是非单词字符,两者合并后等价于匹配除下划线外的所有字符,包括点号、斜杠等本不该出现在单个路径段中的字符,导致单个捕获组可能匹配多个路径段,破坏了原规则按路径分段捕获的逻辑。 - 循环重写触发:由于
\W包含点号,当重写请求指向rewrite.php时,该路径会被第一个规则匹配(rewrite.php符合字符集要求),进而被再次重写为rewrite.php?a=rewrite.php,反复循环后引发ERR_TOO_MANY_REDIRECTS错误。
- 范围失控:
优化方案
方案一:精准控制允许的字符(推荐)
使用Unicode属性正则,明确匹配字母(含非ASCII)、数字、下划线、括号和减号,同时添加条件排除实际存在的文件和目录,彻底避免循环:
# 排除已存在的文件和目录,防止对rewrite.php本身重写 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 匹配1个路径段 RewriteRule ^([\p{L}\p{N}_()\-]+)/?$ rewrite.php?a=$1 [NC,L,QSA] # 匹配2个路径段 RewriteRule ^([\p{L}\p{N}_()\-]+)/([\p{L}\p{N}_()\-]+)/?$ rewrite.php?a=$1&b=$2 [NC,L,QSA] # 匹配3个路径段 RewriteRule ^([\p{L}\p{N}_()\-]+)/([\p{L}\p{N}_()\-]+)/([\p{L}\p{N}_()\-]+)/?$ rewrite.php?a=$1&b=$2&c=$3 [NC,L,QSA] # 匹配4个路径段 RewriteRule ^([\p{L}\p{N}_()\-]+)/([\p{L}\p{N}_()\-]+)/([\p{L}\p{N}_()\-]+)/([\p{L}\p{N}_()\-]+)/?$ rewrite.php?a=$1&b=$2&c=$3&d=$4 [NC,L,QSA] # 匹配5个路径段 RewriteRule ^([\p{L}\p{N}_()\-]+)/([\p{L}\p{N}_()\-]+)/([\p{L}\p{N}_()\-]+)/([\p{L}\p{N}_()\-]+)/([\p{L}\p{N}_()\-]+)/?$ rewrite.php?a=$1&b=$2&c=$3&d=$4&e=$5 [NC,L,QSA]
\p{L}匹配所有Unicode字母(包括é、ñ等非ASCII字符)\p{N}匹配所有Unicode数字_()\-明确允许下划线、括号和减号(减号放在字符集末尾避免歧义)- 现代Apache版本默认已开启PCRE Unicode支持,无需额外配置
方案二:简洁匹配路径段(兼容旧版Apache)
如果服务器不支持Unicode属性,可使用[^/]+匹配单个路径段(除斜杠外的所有字符,自动包含非ASCII),同样添加排除条件:
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]+)/?$ rewrite.php?a=$1 [NC,L,QSA] RewriteRule ^([^/]+)/([^/]+)/?$ rewrite.php?a=$1&b=$2 [NC,L,QSA] RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ rewrite.php?a=$1&b=$2&c=$3 [NC,L,QSA] RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/?$ rewrite.php?a=$1&b=$2&c=$3&d=$4 [NC,L,QSA] RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/?$ rewrite.php?a=$1&b=$2&c=$3&d=$4&e=$5 [NC,L,QSA]
[^/]+匹配单个路径段,自动支持所有非ASCII字符,同时保证不会跨段匹配- 写法更简洁,兼容性更强
内容的提问来源于stack exchange,提问作者Ryan Blundell
相关产品推荐
相关产品推荐

