Je possède un site qui traite différemment /
et %2F
dans la partie chemin (et non dans la chaîne de requête) d'une URL. Est-ce une mauvaise pratique selon le RFC ou le monde réel ?
Je me pose cette question car je suis continuellement confronté à des petites surprises avec le framework web que j'utilise (Ruby on Rails) ainsi qu'avec les couches en dessous (Passenger, Apache, par exemple, j'ai dû autoriser ALLOW_ENCODED_SLASHES
pour Apache). Je commence à penser à supprimer complètement les slashes encodés, mais je me demande si je devrais signaler des bugs là où je remarque un comportement étrange impliquant des slashes encodés.
Pourquoi ai-je des slashes encodés en premier lieu, voici les routes que j'ai :
:controller/:foo/:bar
où :foo
est quelque chose comme un chemin pouvant contenir des slashes. J'ai pensé que la chose la plus simple à faire serait d'URL-encoder foo
pour que les slashes soient ignorés par le mécanisme de routage. Maintenant, j'ai des doutes, et il est clair que les frameworks ne supportent pas vraiment cela, mais selon le RFC, est-ce faux de faire cela de cette façon ?
Voici quelques informations que j'ai rassemblées :
RFC 1738 (URLs) :
En général, une URL a la même interprétation qu'un octet représenté par un caractère et qu'un octet encodé. Cependant, cela n'est pas vrai pour les caractères réservés : encoder un caractère réservé pour un schéma particulier peut changer la sémantique d'une URL.
RFC 2396 (URIs) :
Ces caractères sont appelés "réservés", car leur utilisation dans le composant de l'URI est limitée à leur objectif réservé. Si les données pour un composant de l'URI entraient en conflit avec l'objectif réservé, les données en conflit doivent être échappées avant la formation de l'URI.
(est-ce que s'échapper ici signifie autre chose qu'encoder le caractère réservé ?)
RFC 2616 (HTTP/1.1) :
Les caractères autres que ceux des ensembles "réservé" et "non sûr" (voir RFC 2396 [42]) sont équivalents à leur encodage "
%
HEX HEX".
Il y a aussi ce rapport de bug pour Rails, où ils semblent attendre un comportement différent pour le slash encodé :
Exactement, je m'attends à des résultats différents car ils pointent vers des ressources différentes.
Il cherche le fichier littéral
foo/bar
dans le répertoire racine. La version non échappée cherche le fichier bar dans le répertoire foo.
Il est clair d'après les RFC que brut vs. encodé est équivalent pour les caractères non réservés, mais quelle est la situation pour les caractères réservés ?