O Apache .htaccess pode converter a porcentagem de codificação em URIs codificados de Win-1252 para UTF-8?

2

Eu quero adicionar uma diretiva no meu .htaccess, de modo que, se o navegador estiver apontado para um URI contendo %E4 ( ä ) - ou qualquer outro caractere especial - o .htaccess reescreve automaticamente %E4 ( ä ) como %C3%A4 ( ä ).

Em resumo, quero que o .htaccess converta a codificação Win-1252 por cento em codificação UTF-8 por cento.

Eu sei que posso fazer isso adicionando uma série de regras do mod_rewrite - mas eu queria saber se existe uma diretiva .htaccess nativa que cuidará disso.

====

Isto é tão longe quanto eu tenho até agora (eu tenho muito mais entradas no meu .htaccess do que na lista abaixo, mas eu abreviei a lista para äéîöü por exemplo):

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]

Alguém sabe:

1) Como posso arrumar isso?

2) Não funcionará se houver mais de um caractere especial (ocorrência única ou várias ocorrências) no URI. Existe alguma maneira simples de garantir que as regras lidem com vários caracteres especiais?

    
por Rounin 01.12.2014 / 19:08

1 resposta

1

A única maneira que eu posso pensar em fazer este mais limpo enquanto estiver apenas no Apache seria usar um RewriteMap .

Apontar para um txt para a substituição do mapa forçará você a fazer algumas coisas terríveis para contornar o fato de que RewriteRule substitui toda a string e que você terá que ter um RewriteRule para cada caractere na string (substituído ou não).

Então, em vez disso, eu diria que escrever um script externo em qualquer idioma que você esteja confortável (idealmente um que saiba como converter de 1252 para utf-8 sem precisar do código de hardware das conversões, python vem à mente) Vamos pegar a string completa, fazer as substituições necessárias diretamente (em código real em vez de um grande número de execuções de mod_rewrite), então passar de volta a string fixada para substituição.

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