Apache .htaccess 可以将编码 URI 中的百分比编码从 Win-1252 转换为 UTF-8 吗?

Apache .htaccess 可以将编码 URI 中的百分比编码从 Win-1252 转换为 UTF-8 吗?

我想在我的 .htaccess 中添加一条指令,这样如果浏览器指向包含%E4( ä) 或任何其他特殊字符的 URI,.htaccess 会自动将%E4( ä) 重写为%C3%A4( ä)。

总之,我希望 .htaccess 将 Win-1252 百分比编码转换为 UTF-8 百分比编码。

我知道我可以通过添加一系列 mod_rewrite 规则来做到这一点 - 但我想知道是否有本机 .htaccess 指令可以解决这个问题。

====

这是迄今为止我自己所得到的全部内容(我的 .htaccess 中的条目比下面的列表多得多,但为了便于举例,我将列表缩短为 äéîöü):

RewriteRule ([^\ä]*)\ä([^\ä]*\ä[^\/]*)(\/[.*])? $1%C3%A4$2$3 [N]
RewriteRule ([^\ä]*)\ä([^\ä]*)$ http://www.domain.com/$1%C3%A4$2 [NE,R=301]

RewriteRule ([^\é]*)\é([^\é]*\é[^\/]*)(\/[.*])? $1%C3%A9$2$3 [N]
RewriteRule ([^\é]*)\é([^\é]*)$ http://www.domain.com/$1%C3%A9$2 [NE,R=301]

RewriteRule ([^\î]*)\î([^\î]*\î[^\/]*)(\/[.*])? $1%C3%AE$2$3 [N]
RewriteRule ([^\î]*)\î([^\î]*)$ http://www.domain.com/$1%C3%AE$2 [NE,R=301]

RewriteRule ([^\ö]*)\ö([^\ö]*\ö[^\/]*)(\/[.*])? $1%C3%B6$2$3 [N]
RewriteRule ([^\ö]*)\ö([^\ö]*)$ http://www.domain.com/$1%C3%B6$2 [NE,R=301]

RewriteRule ([^\ü]*)\ü([^\ü]*\ü[^\/]*)(\/[.*])? $1%C3%BC$2$3 [N]
RewriteRule ([^\ü]*)\ü([^\ü]*)$ http://www.domain.com/$1%C3%BC$2 [NE,R=301]

有人知道吗:

1)我该如何整理它?

2) 如果 URI 中有多个特殊字符(一次出现或多次出现),则它将不起作用。有没有直接的方法可以确保规则能够处理多个特殊字符?

答案1

我能想到的唯一能让它在 Apache 中变得更清洁的方法是使用RewriteMap

指向txt地图替换将迫使您做一些可怕的事情来避免RewriteRule替换整个字符串的事实,并且您必须RewriteRule为字符串中的每个字符(替换或不替换)都有一个位置。

因此,我建议用您熟悉的语言编写一个外部脚本(理想情况下,该脚本知道如何从 1252 转换为 utf-8,而无需对转换进行硬编码,我想到的是 python),该脚本将接收完整的字符串,直接进行所需的替换(使用实际代码而不是大量的 mod_rewrite 运行),然后将修复后的字符串传回进行替换。

RewriteMap win1252-to-utf8 prg:/path/to/executable
RewriteRule - ${win1252-to-utf8:%{REQUEST_URI}}

相关内容