Reescrevendo os locais codificados por porcentagem ASCII para seu equivalente codificado em UTF-8

1

Por exemplo, “å” pode ser codificado como /% E5 e /% C3% A5 (utf-8). Todos os meus nomes de arquivos são UTF-8, então as variantes ASCII retornam um 404. Eu quero que ambas as variantes funcionem.

Eu tentei reescrever as URLs incorretas para as codificações corretas com variações da configuração abaixo. Eu não consegui realmente corresponder aos locais, por isso não cheguei a lugar nenhum.

rewrite ^/%E5$ /%C3%A permanent;
rewrite ^/%25E5$ /%25C3%25A permanent;
location = /%E5 { return 301 /%C3%A; }

Como devo corresponder a esses locais codificados percentuais?

    
por Aeyoun 03.01.2015 / 20:34

1 resposta

3

Veja aqui para o mesmo problema no Apache - lá, eu recomendei usar um programa externo para lidar com a reescrita, já que é complicado fazer isso na configuração nativa.

Para nginx, a melhor abordagem pode ser incorporar algum perl em sua configuração via ngx_http_perl_module - use perl_set para definir uma variável para uma versão UTF-8-ified de $r->uri , usando o módulo Encoding (veja aqui ), e reescreva (ou provavelmente melhor, try_files ) para isso.

Editar:

Se você quiser fazer isso apenas manualmente, para URLs específicos ou caracteres específicos, você está perdendo algumas coisas nas suas tentativas:

  • Você está trabalhando contra URLs com escape, enquanto a reescrita deve estar acontecendo contra a string depois de decodificar os caracteres com escape
  • Você está codificando as correspondências para os arquivos que são apenas o caractere especial, não os arquivos que contêm o caractere especial

Tente algo assim ...

rewrite (*UTF8)^(.*)\xe5(.*)$ %1å%2;
    
por 03.01.2015 / 20:51