Я хочу добавить директиву в свой .htaccess, чтобы, если браузер указывает на URI, содержащий %E4
(ä
) - или любой другой специальный символ - .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 содержится более одного специального символа (одно или несколько). Есть ли простой способ гарантировать, что правила будут обрабатывать несколько специальных символов?
Единственный способ, который я могу придумать, чтобы сделать этот чище, просто находясь в 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}}