Réécrire les locations codés en pourcentage ASCII à leur équivalent codé UTF-8

Par exemple, "å" peut être codé sous /% E5 et /% C3% A5 (utf-8). Tous mes noms de files sont UTF-8, donc les variantes ASCII renvoient un 404. Je souhaite que les deux variantes fonctionnent.

J'ai essayé de réécrire les URL incorrectes aux enencodings corrects avec des variantes de la configuration ci-dessous. Je n'ai pas réussi à faire correspondre les locations, donc je n'ai pas eu de place.

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

Comment suis-je censé correspondre à ces locations codés en pourcentage?

Voyez ici pour le même problème dans Apache – là, j'ai recommandé l'utilisation d'un programme externe pour gérer la réécriture, car il est difficile de le faire en configuration native.

Pour nginx, la meilleure approche pourrait être d'intégrer un certain perl dans votre configuration via ngx_http_perl_module – utilisez perl_set pour définir une variable sur une version UTF-8 de $r->uri , en utilisant le module Encoding (voir ici ) et réécrire (ou probablement mieux, try_files ) à cela.

Modifier:

Si vous souhaitez simplement le faire à la main pour des URL spécifiques ou des caractères spécifiques, alors vous manquez quelques choses dans vos tentatives:

  • Vous travaillez contre les URL échappées, alors que la réécriture devrait se produire contre la string après déencoding des caractères échappés
  • Vous êtes en train de coder les correspondances pour les files qui ne sont que le caractère spécial, et non les files contenant le caractère spécial

Essayez quelque chose comme ça …

 rewrite (*UTF8)^(.*)\xe5(.*)$ %1å%2;