我想在我的 .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}}