Je sais qu'un +
dans la chaîne de requête d'une URL représente un espace. Est-ce également le cas en dehors de la région de chaîne de requête? C'est-à-dire, fait l'URL suivante:
http://a.com/a+b/c
représentent en fait:
http://a.com/a b/c
(et doivent donc être codés s'il doit en fait être un +
), ou représente-t-il réellement a+b/c
?
url
encoding
query-string
Francisco Ryan Tolmasky I
la source
la source
rawurldecode
. Je dis cela ici à titre de référence, car il s'agit d'un résultat très apprécié sur la recherche Google pour "les décodages d'URL php se cassent sur le symbole plus".Réponses:
+
caractères du composant path doivent être traités littéralement.Pour être explicite:
+
n'est qu'un caractère spécial dans le composant de requête.la source
+
caractère est interprété comme un espace dans le composant de requête? Ou s'agit-il simplement d'une règle «sauvage»?http:
), autorité (//server.example.com
) et chemin (/myfile/mypage.htm
) et ne définit aucune signification particulière pour le+
caractère. La spécification HTML définit le composant de requête comme étant de type mime application / x-www-form-urlencoded qui est défini comme "remplacer les espaces par+
et d'autres caractères spéciaux comme dans RFC1738". Il ne s'agit donc pas «de la nature», mais d'une norme acceptée (non RFC).Server.UrlEncode
code à tort les espaces en tant que points positifs dans la partie chemin d'accès, violant ainsi les règles HTTP.Vous pouvez trouver une belle liste de caractères codés URL correspondants sur W3Schools .
+
devient%2B
%20
la source
%25252B
Les caractères d'espace ne peuvent être codés que "+" dans un seul contexte: paires clé-valeur application / x-www-form-urlencoded.
RFC-1866 (spécification HTML 2.0), paragraphe 8.2.1. le sous-paragraphe 1. dit: "Les noms et valeurs des champs du formulaire sont échappés: les caractères d'espace sont remplacés par" + ", puis les caractères réservés sont échappés").
Voici un exemple d'une telle chaîne dans l'URL où la RFC-1866 autorise le codage des espaces comme avantages: " http://example.com/over/there?name=foo+bar ". Ainsi, seulement après "?", Les espaces peuvent être remplacés par des points positifs (dans d'autres cas, les espaces doivent être codés en% 20). Cette méthode de codage des données de formulaire est également indiquée dans les spécifications HTML ultérieures, par exemple, recherchez les paragraphes pertinents sur application / x-www-form-urlencoded dans la spécification HTML 4.01, etc.
Mais, comme il est difficile de toujours déterminer correctement le contexte, il est préférable de ne jamais coder les espaces en "+". Il est préférable de coder en pourcentage tous les caractères sauf "non réservé" défini dans RFC-3986, p.2.3. Voici un exemple de code qui illustre ce qui doit être encodé. Il est donné en langage de programmation Delphi (pascal), mais il est très facile de comprendre comment il fonctionne pour n'importe quel programmeur quel que soit le langage possédé:
la source
utilisez la fonction encodeURIComponent pour corriger l'url, cela fonctionne sur le navigateur et node.js
la source
Essayez ci-dessous:
la source
escape
est déconseillé, à la place, vous devez utiliserencodeURI
ou dans le cas de la partie de requêteencodeURIComponent
. La chaîne de paramètres doit également être codée conformément à w3c .Tu coderas toujours les URL.
Voici comment Ruby code votre URL:
la source