Soy consciente de que un +
en la cadena de consulta de una URL representa un espacio. ¿Es este también el caso fuera de la región de la 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 realmente debería ser a +
), ¿o en realidad representa a+b/c
?
url
encoding
query-string
Francisco Ryan Tolmasky I
fuente
fuente
rawurldecode
. Digo esto aquí como referencia porque este es un resultado de alta calificación en la búsqueda de Google para "php url decode breaks on plus symbol".Respuestas:
+
caracteres en el componente de trazado se espera que sea tratada literalmente.Para ser explícito:
+
es solo un carácter especial en el componente de consulta.fuente
+
carácter se interpreta como un espacio en el componente de consulta? ¿O es simplemente una regla "de la naturaleza"?http:
), autoridad (//server.example.com
) y ruta (/myfile/mypage.htm
), y no define ningún significado especial para el+
personaje. La especificación HTML define el componente de consulta para que sea de tipo mime application / x-www-form-urlencoded, que se define como "reemplazar espacios con+
y otros caracteres especiales como en RFC1738". Por lo tanto, no es "de la naturaleza", sino de un estándar aceptado (no RFC).Server.UrlEncode
codifica erróneamente espacios como ventajas en la porción de ruta también, violando las reglas HTTP.Puede encontrar una buena lista de caracteres codificados con URL correspondientes en W3Schools .
+
se convierte%2B
%20
fuente
%25252B
Los caracteres de espacio solo se pueden codificar como "+" en un contexto: pares de clave-valor de application / x-www-form-urlencoded.
El RFC-1866 (especificación HTML 2.0), párrafo 8.2.1. el subpárrafo 1. dice: "Se escapan los nombres y valores de los campos de formulario: los caracteres de espacio se reemplazan por '+', y luego se escapan los caracteres reservados").
Aquí hay un ejemplo de una cadena de este tipo en URL donde RFC-1866 permite codificar espacios como ventajas: " http://example.com/over/there?name=foo+bar ". Por lo tanto, solo después de "?", Los espacios se pueden reemplazar por más (en otros casos, los espacios se deben codificar en% 20). Esta forma de codificar datos de formulario también se proporciona en especificaciones HTML posteriores, por ejemplo, busque párrafos relevantes sobre application / x-www-form-urlencoded en la especificación HTML 4.01, y así sucesivamente.
Pero, dado que es difícil determinar siempre el contexto correctamente, es la mejor práctica nunca codificar espacios como "+". Es mejor codificar en porcentaje todos los caracteres, excepto "sin reservas" definidos en RFC-3986, p.2.3. Aquí hay un ejemplo de código que ilustra lo que debe codificarse. Se administra 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:
fuente
use la función encodeURIComponent para corregir la URL, funciona en el navegador y node.js
fuente
Prueba a continuación:
fuente
escape
está en desuso, en su lugar, debe usarencodeURI
o en el caso de la parte de consultaencodeURIComponent
. Además, la cadena de parámetros debe codificar de acuerdo con w3c .Siempre codificarás las URL.
Así es como Ruby codifica su URL:
fuente