apache 使用重写规则从URL中删除%20

q5lcpyga  于 2023-03-19  发布在  Apache
关注(0)|答案(2)|浏览(211)

我有一些网址与%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]

问题是第一个组停止在%20
因此,该规则不适用于如下URL:

https://www.example.com/aa2aa%20bbbb/page.html

有什么建议吗?

9vw9lbht

9vw9lbht1#

这里的一个基本问题是,RewriteRulepattern 匹配的URL路径已经是URL解码的(%解码的),因此您需要匹配一个文本 space,而不是%20(编码的空格)。
(* 旁白:* 如果请求的URL有双重编码的 * 空格 *,即%2520,您只需要匹配%20
例如:

RewriteRule ^/(\S+)\s+(.*) /$1$2 [R=301,L]

\s是所有空格字符的简写字符类。\S[^\s]相同(即除空格外的任何字符)。或者,您可以只使用^/(.*)\s+(.*)这样的正则表达式,但这效率较低,因为它可能需要更多的回溯。
我删除了正则表达式的尾部$,因为这里不需要它(因为默认情况下*量词是贪婪的)。
RewriteRulepattern 上的斜杠前缀假定此指令直接用于 servervirtualhost 上下文中(即,不在<Directory>.htaccess上下文中)。
您还缺少L标志(如果在此上下文中有任何指令,则这一点很重要)。

g9icjywg

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

相关问题