URL e più segni

Sono consapevole che un + nella stringa di query di un URL rappresenta uno spazio. Questo è anche il caso al di fuori della regione stringa di query? Vale a dire, fa il seguente URL:

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

in realtà rappresentano:

 http://a.com/ab/c 

(e quindi deve essere codificato se dovrebbe effettivamente essere un + ), o in effetti rappresenta effettivamente a+b/c ?

  • Si prevede che la codifica percentuale nella sezione del percorso di un URL sia decodificata, ma
  • qualsiasi carattere + nel componente del percorso dovrebbe essere trattato letteralmente.

Per essere espliciti: + è solo un carattere speciale nel componente di query.

È ansible trovare un elenco di caratteri codificati URL corrispondenti su W3Schools .

  • + diventa %2B
  • lo spazio diventa %20

I caratteri spaziali possono essere codificati come “+” solo in un contesto: coppie di valori-chiave di application / x-www-form-urlencoded.

RFC-1866 (specifica HTML 2.0), paragrafo 8.2.1. il paragrafo 1. dice: “I nomi e i valori dei campi del modulo sono sottoposti a escape: i caratteri dello spazio sono sostituiti da” + “, quindi i caratteri riservati sono sfuggiti”).

Ecco un esempio di tale stringa nell’URL in cui RFC-1866 consente di codificare gli spazi come plus: ” http://example.com/over/there?name=foo+bar “. Quindi, solo dopo “?”, Gli spazi possono essere sostituiti da punti positivi (negli altri casi, gli spazi devono essere codificati in% 20). Questo modo di codificare i dati del modulo viene anche fornito nelle specifiche HTML successive, ad esempio, cercare i paragrafi pertinenti su application / x-www-form-urlencoded nella specifica HTML 4.01 e così via.

Tuttavia, poiché è difficile determinare sempre correttamente il contesto, è consigliabile non codificare mai spazi come “+”. È meglio codificare per percentuale tutti i caratteri tranne “senza riserva” definiti in RFC-3986, p.2.3. Ecco un esempio di codice che illustra ciò che dovrebbe essere codificato. Viene fornito nel linguaggio di programmazione Delphi (pascal), ma è molto facile capire come funziona per qualsiasi programmatore indipendentemente dal linguaggio posseduto:

 (* 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; 

usa la funzione encodeURIComponent per correggere url, funziona su Browser e node.js

 res.redirect("/signin?email="+encodeURIComponent("[email protected]")); > encodeURIComponent("http://a.com/a+b/c") 'http%3A%2F%2Fa.com%2Fa%2Bb%2Fc' 

Prova qui sotto:

  

Dovrai sempre codificare gli URL.

Ecco come Ruby codifica il tuo URL:

 irb(main):008:0> CGI.escape "a.com/a+b" => "a.com%2Fa%2Bb"