URLs e sinais de adição

Estou ciente de que um + na string de consulta de uma URL representa um espaço. Esse também é o caso fora da região da cadeia de consulta? Ou seja, faz o seguinte URL:

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

realmente representam:

 http://a.com/ab/c 

(e, portanto, precisa ser codificado se realmente for um + ) ou, na verdade, ele representa a+b/c ?

  • Espera-se que a codificação percentual na seção de caminho de uma URL seja decodificada, mas
  • Espera-se que qualquer caractere + no componente de caminho seja tratado literalmente.

Para ser explícito: + é apenas um caractere especial no componente de consulta.

Você pode encontrar uma boa lista de caracteres codificados com URL correspondentes no W3Schools .

  • + se torna %2B
  • o espaço se torna %20

Os caracteres de espaço só podem ser codificados como “+” em um contexto: pares de valores-chave application / x-www-form-urlencoded.

O RFC-1866 (especificação HTML 2.0), parágrafo 8.2.1. parágrafo 1. diz: “Os nomes e valores dos campos de formulário são escapados: caracteres de espaço são substituídos por ‘+’ e, em seguida, os caracteres reservados são escapados”).

Aqui está um exemplo de uma string como essa na URL, na qual a RFC-1866 permite que os espaços de codificação sejam positivos: ” http://example.com/over/there?name=foo+bar “. Então, somente depois de “?”, Espaços podem ser substituídos por vantagens (em outros casos, espaços devem ser codificados para% 20). Essa maneira de codificar dados de formulário também é fornecida em especificações HTML posteriores, por exemplo, procure parágrafos relevantes sobre application / x-www-form-url codificado em HTML 4.01 Specification e assim por diante.

Mas, como é difícil sempre determinar corretamente o contexto, a melhor prática é nunca codificar espaços como “+”. É melhor codificar em porcentagem todos os caracteres, exceto “unreserved”, definido no RFC-3986, p.2.3. Aqui está um exemplo de código que ilustra o que deve ser codificado. Ele é dado na linguagem de programação Delphi (pascal), mas é muito fácil entender como ele funciona para qualquer programador, independentemente do idioma que possua:

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

use a function encodeURIComponent para corrigir o url, ele funciona no Browser e no 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' 

Tente abaixo:

  

Você sempre codificará URLs.

Veja como o Ruby codifica seu URL:

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