¿Alguien sabe la lista completa de caracteres que se pueden usar dentro de un GET sin codificar? En este momento estoy usando AZ az y 0-9 ... pero estoy buscando encontrar la lista completa.
También me interesa saber si hay una especificación publicada para la próxima incorporación de URLs chinas y árabes (ya que obviamente eso tendrá un gran impacto en mi pregunta)
!*'();:@&=+$,/?#[]
o no reservadosA-Za-z0-9_.~-
(o un carácter de porcentaje%
como parte de una codificación de porcentaje)REGEXP '[^]A-Za-z0-9_.~!*''();:@&=+$,/?#[%-]+'
para encontrar cadenas de URL con caracteres incorrectos. Quizás también sea útil para alguien más.Respuestas:
De la especificación RFC 1738 :
EDITAR: Como @Jukka K. Korpela señala correctamente, este RFC fue actualizado por RFC 3986 . Esto ha ampliado y aclarado los caracteres válidos para el host, desafortunadamente no es fácil de copiar y pegar, pero haré lo mejor que pueda.
En el primer orden coincidente:
fuente
A-Za-z0-9_.-~
caracteres no reservados y reservados al comienzo de esta respuesta.!*'();:@&=+$,/?#[]
Puede ahorrar tiempo para las personasreserved = gen-delims / sub-delims gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
http://en.wikipedia.org/wiki/Percent-encoding#Types_of_URI_characters
dice que estos son RFC 3986 caracteres no reservados (sec. 2.3), así como los caracteres reservados (sec 2.2) si que necesitan para conservar su significado especial. Y también un carácter de porcentaje como parte de una codificación de porcentaje.
fuente
The characters allowed in a URI are either reserved or unreserved (or a percent character as part of a percent-encoding)
La lista completa de los 66 caracteres no reservados se encuentra en RFC3986, aquí: http://tools.ietf.org/html/rfc3986#section-2.3
Este es cualquier carácter en el siguiente conjunto de expresiones regulares:
fuente
{}^\~
ybacktick
no es seguro. Y RFC3986 enumera \ como inseguro debido al sistema de archivos. Esto significa que también{}^
podría usarse.-
o ponerlo al principio o al final de la clase de caracteres, porque en[.-~]
realidad contiene todos los caracteres ASCII del 46 al 126.Lo probé solicitando mi sitio web (apache) con todos los caracteres disponibles en mi teclado alemán como parámetro de URL:
Estos no fueron codificados:
No codificado después de
urlencode()
:No codificado después de
rawurlencode()
:Nota: Antes de PHP 5.3.0
rawurlencode()
codificado~
debido a RFC 1738 . Pero esto fue reemplazado por RFC 3986, por lo que ahora es seguro de usar. Pero no entiendo por qué, por ejemplo,{}
están codificadosrawurlencode()
porque no se mencionan en RFC 3986.Una prueba adicional que hice fue con respecto a la vinculación automática en los mensajes de correo. Probé Mozilla Thunderbird, aol.com, outlook.com, gmail.com, gmx.de y yahoo.de y vincularon completamente las URL que contienen estos caracteres:
Por supuesto
?
, también estaba vinculado, pero solo si se usó una vez.Algunas personas ahora sugerirían usar solo los
rawurlencode()
caracteres, pero ¿alguna vez escuchó que alguien tuvo problemas para abrir estos sitios web?Asterisco
http://wayback.archive.org/web/*/http://google.com
Colon
https://en.wikipedia.org/wiki/Wikipedia:About
Además
https://plus.google.com/+google
Al firmar, Colón, coma y signo de exclamación
https: //www.google.com/maps/place/USA/@36.2218457, ...
Debido a eso, estos caracteres deberían poder utilizarse sin codificar sin problemas. Por supuesto, no debe usarlo
&;
debido a secuencias de codificación como&
. La misma razón es válida%
ya que solía codificar caracteres en general. Y a=
medida que asigna un valor a un nombre de parámetro.Finalmente, diría que está bien usar estos sin codificar:
Pero si espera URL generadas aleatoriamente que no debe usar
.!
, porque marcan el final de una oración y algunas aplicaciones de correo no vincularán automáticamente el último carácter de la URL. Ejemplo:fuente
+
especialmente el letrero :-DDesde aqui
fuente
Estos se enumeran en RFC3986 . Consulte el ABNF recopilado para URI para ver qué se permite dónde y la expresión regular para el análisis / validación.
fuente
RFC3986 define dos conjuntos de caracteres que puede usar en un URI:
Caracteres reservados :
:/?#[]@!$&'()*+,;=
Personajes no reservados :
A-Za-z0-9-_.~
fuente
El próximo cambio es para nombres de dominio chinos y árabes, no URI. Los URI internacionalizados se denominan IRI y se definen en RFC 3987 . Sin embargo, habiendo dicho que recomendaría no hacerlo usted mismo, sino confiar en una biblioteca ya probada, ya que hay muchas opciones de codificación / decodificación de URI y lo que se considera seguro por especificación, frente a lo que es seguro por uso real (navegadores) .
fuente
Si desea brindar un tipo especial de experiencia a los usuarios, puede utilizar
pushState
para llevar una amplia gama de caracteres a la URL del navegador:fuente