Une URL est-elle autorisée à contenir un espace?


132

Un URI (en particulier une URL HTTP) est-il autorisé à contenir un ou plusieurs espaces? Si une URL doit être encodée, est-ce +juste une convention couramment suivie ou une alternative légitime?

En particulier, quelqu'un peut-il pointer vers une RFC qui indique qu'une URL avec un espace doit être encodée?

Motivation pour la question: lors du test bêta d'un site Web, j'ai noté que certaines URL étaient construites avec des espaces. Firefox semblait faire la bonne chose, ce qui m'a surpris! Mais je voulais pouvoir diriger les développeurs vers une RFC afin qu'ils ressentent le besoin de corriger ces URL.


sur-ensemble qui est venu plus tard: quels sont tous les caractères invalides: stackoverflow.com/questions/1547899/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Réponses:


101

Selon RFC 1738 :

Peu sûr:

Les caractères peuvent être dangereux pour un certain nombre de raisons. Le caractère espace n'est pas sûr car des espaces importants peuvent disparaître et des espaces insignifiants peuvent être introduits lorsque les URL sont transcrites ou composées ou soumises au traitement de programmes de traitement de texte. Les caractères "<"et ne ">"sont pas sûrs 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 caractère "#"n'est pas sûr 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 d'un identifiant de fragment / d'ancrage qui pourrait le suivre. Le personnage"%"est dangereux car il est utilisé pour les encodages d'autres caractères. D'autres caractères ne sont pas sûrs car les passerelles et autres agents de transport sont connus pour modifier parfois ces caractères. Ces personnages sont "{", "}", "|", "\", "^", "~", "[", "]"et "`".

Tous les caractères non sécurisés doivent toujours être encodés dans une URL . Par exemple, le caractère "#"doit être codé dans les URL, même dans les systèmes qui ne traitent normalement pas les identificateurs de fragment ou d'ancrage, de sorte que 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.


2
1738 a été remplacé par 2396. ietf.org/rfc/rfc2396.txt C'est la spécification Uri actuelle. Cela n'a pas d'importance dans ce cas cependant.
Steve Severance

40
Et 2396 a été remplacé par 3986. Beaucoup de gens se trompent, car les RFC sont immuables et ne disent donc pas au lecteur qu'elles sont devenues obsolètes. Astuce: utilisez plutôt tools.ietf.org/html/rfcnnnn , comme tools.ietf.org/html/rfc2396 , il affiche les métadonnées manquantes en haut.
Julian Reschke le

43

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 que vous avez 4 champs, le serveur HTTP vous dira que c'est 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 encodé en +

GET /url?var=foo+bar HTTP/1.1 

plutôt que

GET /url?var=foo%20bar HTTP/1.1 

Et si var était vraiment "foo + bar" et non "foo bar"?
Ivo3185 du

2
Je dirais que c'est une exigence de la couche de transport, pas de la spécification URI elle-même. GET est clairement une propriété de la spécification http:, pas de la spécification d'URL. De même, vous pourriez affirmer que les guillemets dans les URL "doivent" être codés car sinon les pages Web se briseraient. Mais c'est une propriété des limitations de formatage HTML (contre lesquelles il existe d'autres stratégies), pas une propriété de la spécification d'URL.
Kent Fredric

ietf.org/rfc/rfc1738.txt - Les caractères non sécurisés, y compris les espaces) doivent être encodés
Julien

@KentFredric Il s'agit plus probablement de la couche de présentation , pas de la couche de transport . Comme l' écrit (presque) Julien , la spécification URI originale ( RFC 1630 ) contient cette restriction, elle fait donc partie de la spécification URI elle-même indépendamment de vos sentiments personnels. Puisque la spécification d'URI a été écrite après les brouillons HTTP, il est très possible que les URI aient été conçus avec HTTP à l'esprit, y compris l'interdiction d'utiliser des espaces, mais cela n'a pas vraiment d'importance, n'est-ce pas? La vérité est que la spécification est ce que la spécification est.
Christopher Schultz

38

Réponse plus courte: non, vous devez encoder un espace; il est correct d'encoder un espace comme +, mais uniquement dans la chaîne de requête; dans le chemin que vous devez utiliser %20.


1
Salut, je suis également confus, parfois j'ai vu le livre utiliser "+" mais parfois "% 20", pouvez-vous montrer un exemple pour cela? Lorsque l'utilisateur soumet le formulaire, comment le formulaire encode l'espace? avec quel personnage?
GMsoF

1
Voir cette réponse pour plus de détails.
DavidRR

qu'en est-il de la partie fragment / hachée? Comment les espaces doivent-ils y être encodés?
gumkins

@gumkins: le fragment (# et après) n'est pas envoyé au serveur. En pratique, vous pouvez utiliser% 20 ou + n'importe où pour encoder un espace.
Julien

9

Les URL sont définies dans la RFC 3986 , bien que d'autres RFC soient également pertinentes, mais la RFC 1738 est obsolète.

Ils peuvent ne pas avoir d'espaces, ainsi que de nombreux autres caractères. Puisque ces caractères interdits doivent souvent être représentés d'une manière ou d'une autre, il existe un schéma pour les encoder dans une URL en les traduisant en leur équivalent hexadécimal ASCII avec un préfixe «%».

La plupart des langages / plates-formes de programmation fournissent des fonctions d'encodage et de décodage d'URL, même s'ils ne respectent pas correctement les normes RFC. Par exemple, je sais que PHP ne le fait pas.


7

Oui, cependant, l'espace est généralement codé en "% 20". Tous les paramètres qui passent à une URL doivent être encodés, simplement pour des raisons de sécurité.


6

L'URL peut contenir un caractère d'espace et elle sera affichée 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 façon dont un navigateur affichera l'URL.

Donc, à la place, vous pouvez remplacer le caractère d'espace dans l'URL par n'importe quel caractère qui, selon vous, rendra l'URL plus lisible et "Jolie";) ..... O les caractères généraux qui sont 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 censé être déjà dans l'URL.

Veuillez éviter les%, &,}, {,], [, /,>, <comme remplacement du caractère de l'espace URL car ils peuvent générer une erreur sur certains navigateurs et plates-formes.

Comme vous pouvez le voir, le débordement Stak lui-même utilise le caractère «-» comme espace de remplacement (% 20).

Ayez un bon questionnement.


5

Les URL ne doivent pas contenir d'espaces. Si vous devez en résoudre un qui le fait, utilisez sa valeur codée de%20


5

Quelqu'un peut-il 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 finalement qu'un caractère espace ne peut jamais faire partie d'une URL syntaxiquement légale, donc le terme «URL avec un espace» est une contradiction en soi.


3

Pour répondre à ta question. Je dirais qu'il est assez courant pour les applications de remplacer les espaces dans les valeurs qui seront utilisées dans les URL. La raison en est généralement d'éviter le codage en pourcentage (URI) plus difficile à lire.

Consultez cet article de wikipedia sur l' encodage en pourcentage .


2

Firefox 3 affichera les %20s dans les URL sous forme d'espaces dans la barre d'adresse.


Ce n'est pas une bonne réponse à la question assez simple: "Is a URL allowed to contain a space?". Plutôt un commentaire.
Roko C. Buljan
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.