Un URI (en particulier une URL HTTP) est-il autorisé à contenir un ou plusieurs espaces? Si une URL doit être codée, c'est +
juste une convention communément suivie, ou une alternative légitime?
En particulier, quelqu'un peut-il pointer sur un RFC indiquant qu'une URL avec un espace doit être codée?
Motivation de la question: Lors du test bêta d'un site Web, j'ai remarqué que certaines URL étaient construites avec des espaces. Firefox semblait faire le bon choix, ce qui m'a surpris! Mais je voulais être capable de diriger les développeurs vers une RFC pour qu'ils ressentent le besoin de corriger ces URL.
Selon RFC 1738 :
Peu sûr:
Les caractères peuvent être dangereux pour plusieurs raisons. Le caractère d'espace est dangereux car des espaces importants peuvent disparaître et des espaces insignifiants peuvent être introduits lors de la transcription ou de la composition d'URL, ou soumis au traitement de programmes de traitement de texte. Les personnages
"<"
et">"
sont dangereux car ils sont utilisés comme délimiteurs autour des URL en texte libre; le guillemet ("""
) est utilisé pour délimiter les URL dans certains systèmes. Le personnage"#"
est dangereux et doit toujours être codé car il est utilisé dans le World Wide Web et dans d’autres systèmes pour délimiter une URL à partir d’un identificateur de fragment/ancre susceptible de le suivre. Le personnage"%"
est dangereux car il est utilisé pour l’encodage d’autres caractères. D'autres caractères sont dangereux car les passerelles et autres agents de transport sont parfois connus pour modifier de tels caractères. Ces personnages sont"{"
,"}"
,"|"
,"\"
,"^"
,"~"
,"["
,"]"
, et"`"
.Tous les caractères non sécurisés doivent toujours être codés dans une URL . Par exemple, le caractère
"#"
doit être codé dans les URL même dans les systèmes qui ne traitent pas normalement d'identificateurs de fragment ou d'ancrage. Ainsi, si l'URL est copiée dans un autre système qui les utilise, il ne sera pas nécessaire de modifier le codage de l'URL.
Pourquoi doit-il être encodé? Une demande ressemble à ceci:
GET /url HTTP/1.1
(Ignoring headers)
Il y a 3 champs séparés par un espace blanc. Si vous mettez un espace dans votre URL:
GET /url end_url HTTP/1.1
Vous savez avoir 4 champs, le serveur HTTP vous dira qu'il s'agit d'une requête invalide.
GET /url%20end_url HTTP/1.1
3 champs => valide
Remarque: dans la chaîne de requête (après?), Un espace est généralement codé comme un +
GET /url?var=foo+bar HTTP/1.1
plutôt que
GET /url?var=foo%20bar HTTP/1.1
Réponse plus courte: non, vous devez encoder un espace; il est correct pour encoder un espace comme +
, mais uniquement dans la chaîne de requête; dans le chemin vous devez utiliser %20
.
Les URL sont définies dans RFC 3986 , bien que d'autres RFC soient également pertinentes, mais RFC 1738 est obsolète.
Ils ne peuvent pas avoir d'espaces, avec beaucoup d'autres personnages. Étant donné que ces caractères interdits doivent souvent être représentés, il existe un système pour les encoder dans une URL en les traduisant en leur équivalent ASCII hexadécimal avec le préfixe "%".
La plupart des langages de programmation/plates-formes fournissent des fonctions de codage et de décodage des URL, bien qu'ils ne respectent pas toujours les normes RFC. Par exemple, je sais que PHP ne le fait pas.
L'URL peut contenir un caractère d'espacement et sera affiché sous la forme% 20 dans la plupart des navigateurs, mais les règles de codage du navigateur changent assez souvent et nous ne pouvons pas dépendre de la manière dont le navigateur affichera l'URL.
Vous pouvez donc remplacer le caractère d'espacement dans l'URL par tout autre caractère qui, à votre avis, rend l'URL plus lisible et "jolie";) ..... Les caractères les plus généraux préférés sont "-", "_", "+" .... mais ce ne sont pas les compulsions donc vous pouvez utiliser n'importe quel caractère qui n'est pas supposé être dans l'URL déjà.
Veuillez éviter les%, &,}, {,], [ /,>, <en tant que remplacement de caractère d'espace URL car ils peuvent générer une erreur sur certains navigateurs et plates-formes.
Comme vous pouvez le constater, le débordement de Stak lui-même utilise le caractère '-' comme remplacement de l'espace (% 20).
Ayez un bon questionnement.
Oui, l’espace est généralement encodé en "% 20". Tous les paramètres qui passent à une URL doivent être codés, simplement pour des raisons de sécurité.
Les URLs doivent not avoir des espaces. Si vous devez en traiter un, utilisez la valeur codée de %20
Est-ce que quelqu'un peut pointer vers un RFC indiquant qu'une URL avec un espace doit être encodée?
Les URI, et donc les URL, sont définis dans la RFC 3986.
Si vous regardez la grammaire définie là-bas, vous remarquerez éventuellement qu'un caractère d'espacement ne peut jamais faire partie d'une URL syntaxiquement légale. Le terme "URL avec espace" est donc une contradiction en soi.
Pour répondre à ta question. Je dirais qu'il est assez courant que les applications remplacent les espaces par des valeurs qui seront utilisées dans les URL. La raison en est généralement d'éviter le codage plus difficile à lire (URI).
Consultez cet article de Wikipédia sur Pourcentage de codage .
Firefox 3 affichera %20
s dans les URL sous forme d'espaces dans la barre d'adresse.