Pregunta

Soy consciente de que un + en la cadena de consulta de una URL representa un espacio. ¿Este también es el caso fuera de la región de cadena de consulta? Es decir, hace la siguiente URL:

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

en realidad representan:

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

(y, por lo tanto, debe codificarse si en realidad debería ser un + ), o, de hecho, ¿representa realmente a + b / c ?

¿Fue útil?

Solución

  • Se espera que se decodifique el porcentaje de codificación en la sección de ruta de una URL, pero
  • se espera que cualquier carácter + en el componente de la ruta sea tratado literalmente.

Para ser explícito: + es solo un carácter especial en el componente de consulta.

Otros consejos

Puede encontrar una buena lista de caracteres codificados en URL correspondientes en W3Schools .

  • + se convierte en %2B
  • el espacio se convierte en %20

Los caracteres de espacio solo pueden codificarse como " + " en un contexto: aplicación / x-www-form-urlencoded pares de clave-valor.

El RFC-1866 (especificación HTML 2.0), párrafo 8.2.1. el subpárrafo 1. dice: " Los nombres y valores de los campos de formulario se escapan: los caracteres de espacio se reemplazan por `+ ', y luego los caracteres reservados se escapan ").

Aquí hay un ejemplo de una cadena de este tipo en la URL donde RFC-1866 permite la codificación de espacios como ventajas: " http://example.com/over/there?name=foo+bar " ;. Por lo tanto, solo después de "? & Quot ;, los espacios pueden reemplazarse por ventajas (en otros casos, los espacios deben codificarse como% 20). Esta forma de codificar datos de formularios también se proporciona en las especificaciones HTML posteriores, por ejemplo, busque párrafos relevantes sobre application / x-www-form-urlencoded en HTML 4.01 Specification, y así sucesivamente.

Pero, como siempre es difícil determinar correctamente el contexto, es la mejor práctica nunca codificar espacios como " + " Es mejor codificar en porcentaje todos los caracteres excepto " sin reservas " definido en RFC-3986, p.2.3. Aquí hay un ejemplo de código que ilustra lo que debe codificarse. Se da en lenguaje de programación Delphi (pascal), pero es muy fácil de entender cómo funciona para cualquier programador, independientemente del lenguaje que posea:

(* 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 función encodeURIComponent para arreglar la url, funciona en Browser y 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'

Prueba a continuación:

<script type="text/javascript">

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

Siempre codificarás las URL.

Aquí es cómo Ruby codifica tu URL:

irb(main):008:0> CGI.escape "a.com/a+b"
=> "a.com%2Fa%2Bb"
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top