我有一些网址与%20
(编码空间)内。我必须删除%20
。
比如说
https://www.example.com/aaaa%20bbbb/page.html
必须成为
https://www.example.com/aaaabbbb/page.html
我尝试了以下Apache重写规则:
RewriteRule ^/([^%20]*)(?:%20)+(.*)$ /$1$2 [R=301]
问题是第一个组停止在%
、2
或0
上
因此,该规则不适用于如下URL:
https://www.example.com/aa2aa%20bbbb/page.html
有什么建议吗?
2条答案
按热度按时间9vw9lbht1#
这里的一个基本问题是,
RewriteRule
pattern 匹配的URL路径已经是URL解码的(%解码的),因此您需要匹配一个文本 space,而不是%20
(编码的空格)。(* 旁白:* 如果请求的URL有双重编码的 * 空格 *,即
%2520
,您只需要匹配%20
。例如:
\s
是所有空格字符的简写字符类。\S
与[^\s]
相同(即除空格外的任何字符)。或者,您可以只使用^/(.*)\s+(.*)
这样的正则表达式,但这效率较低,因为它可能需要更多的回溯。我删除了正则表达式的尾部
$
,因为这里不需要它(因为默认情况下*
量词是贪婪的)。RewriteRule
pattern 上的斜杠前缀假定此指令直接用于 server 或 virtualhost 上下文中(即,不在<Directory>
或.htaccess
上下文中)。您还缺少
L
标志(如果在此上下文中有任何指令,则这一点很重要)。g9icjywg2#
你可以修改你的正则表达式,在第一组之后包含任何字母数字字符或下划线的字符类。这将确保第一组包含编码空格之前的所有字符,而不管URL中是否有任何特殊字符。以下是Apache重写规则的更新版本:
重写规则^/([a-zA-Z 0 -9_]+)(?:%20)+(.)$ /$1$2 [R=301]
此正则表达式将匹配以一个或多个字母数字字符或下划线序列开头,后跟一个或多个编码空格(%20),并以任意字符结尾的任何字符串。第一组将捕获编码空格之前的所有字符,第二组将捕获编码空格之后的字符。
根据此规则,https://www.example.com/aa2aa%20bbbb/page.html等URL应正确重写为https://www.example.com/aa2aabbbb/page.html。