web-dev-qa-db-fra.com

URL et signes plus

Je suis conscient 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 la chaîne de requête? C'est-à-dire, fait l'URL suivante:

http://a.com/a+b/c

représentent réellement:

http://a.com/a b/c

(et doivent donc être encodés s'il s'agit réellement d'un +), ou représente-t-il réellement a+b/c?

209
  • Le pourcentage de codage dans la section de chemin d’une URL doit être décodé, mais
  • tous les caractères + du composant de chemin doivent être traités littéralement.

Pour être explicite: + n'est qu'un caractère spécial dans le composant de requête.

165
Stobor

Vous pouvez trouver une liste de Nice des caractères encodés en URL correspondants sur W3Schools .

  • + devient %2B
  • l'espace devient %20
224
Niels R.

Les caractères d'espacement ne peuvent être codés que "+" dans un seul contexte: paires clé-valeur application/x-www-form-urlencoded.

La RFC-1866 (spécification HTML 2.0), paragraphe 8.2.1. Le sous-paragraphe 1 dit: "Les noms et les valeurs des champs de formulaire sont échappés: les espaces sont remplacés par" + ", puis les caractères réservés sont échappés").

Voici un exemple d'une telle chaîne dans une URL où RFC-1866 autorise le codage d'espaces en tant qu'avantages: " http://example.com/over/there?name=foo+bar ". Ainsi, ce n’est qu’après "?" Que les espaces peuvent être remplacés par des plus (dans d’autres cas, ils doivent être codés en% 20). Cette méthode de codage des données de formulaire est également donné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 recommandé de ne jamais coder les espaces en tant que "+". Il vaut mieux encoder tous les caractères, sauf "sans réserve" défini dans RFC-3986, p.2.3. Voici un exemple de code illustrant ce qui devrait être encodé. Il est donné en langage de programmation Delphi (Pascal), mais il est très facile de comprendre comment cela fonctionne pour tout programmeur, peu importe le langage possédé:

(* percent-encode all unreserved characters as defined in RFC-3986, p.2.3 *)
function UrlEncodeRfcA(const S: AnsiString): AnsiString;
const    
  HexCharArrA: array [0..15] of AnsiChar = '0123456789ABCDEF';
var
  I: Integer;
  c: AnsiChar;
begin
 // percent-encoding, see RFC-3986, p. 2.1
  Result := S;
  for I := Length(S) downto 1 do
  begin
    c := S[I];
    case c of
      'A' .. 'Z', 'a' .. 'z', // alpha
      '0' .. '9',             // digit
      '-', '.', '_', '~':;    // rest of unreserved characters as defined in the RFC-3986, p.2.3
      else
        begin
          Result[I] := '%';
          Insert('00', Result, I + 1);
          Result[I + 1] := HexCharArrA[(Byte(C) shr 4) and $F)];
          Result[I + 2] := HexCharArrA[Byte(C) and $F];
        end;
    end;
  end;
end;

function UrlEncodeRfcW(const S: UnicodeString): AnsiString;
begin
  Result := UrlEncodeRfcA(Utf8Encode(S));
end;
20
Maxim Masiutin

utilisez la fonction encodeURIComponent pour corriger l’url, cela fonctionne sur le navigateur et sur node.js

res.redirect("/signin?email="+encodeURIComponent("[email protected]"));


> encodeURIComponent("http://a.com/a+b/c")
'http%3A%2F%2Fa.com%2Fa%2Bb%2Fc'
1
Baryon Lee