Question

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 l’URL suivante:

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

représente en réalité:

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

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

Était-ce utile?

La solution

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

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

Autres conseils

Vous pouvez trouver une belle liste de caractères encodés dans les URL correspondantes dans W3Schools .

  • + devient % 2B
  • l'espace devient % 20

Les espaces ne peuvent être codés que sous la forme " + " dans un 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 l'URL où la RFC 1866 autorise le codage d'espaces en tant que points positifs: & # 8211; "noreferrer"> http://example.com/over/there?name=foo+bar " Ainsi, ce n’est qu’après "?" Que 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 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 encoder d'espaces en tant que "+". Il est préférable de coder 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, quel que soit 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;

utilise la fonction encodeURIComponent pour corriger l'URL, cela fonctionne sur le navigateur et sur node.js

res.redirect("/signin?email="+encodeURIComponent("aaa+bbb-ccc@example.com"));


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

Essayez ci-dessous:

<script type="text/javascript">

function resetPassword() {
   url: "submitForgotPassword.html?email="+fixEscape(Stringwith+char);
}
function fixEscape(str)
{
    return escape(str).replace( "+", "%2B" );
}
</script>

Vous devez toujours encoder les URL.

Voici comment Ruby code votre URL:

irb(main):008:0> CGI.escape "a.com/a+b"
=> "a.com%2Fa%2Bb"
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top