tener - Caracteres permitidos en una URL
meta descripcion (8)
Los caracteres permitidos en un URI son reservados o no reservados (o un carácter de porcentaje como parte de un porcentaje de codificación)
http://en.wikipedia.org/wiki/Percent-encoding#Types_of_URI_characters
dice que estos son caracteres sin reserva de RFC 3986 (sección 2.3) así como también personajes reservados (sección 2.2) si necesitan conservar su significado especial. Y también un carácter de porcentaje como parte de un porcentaje de codificación.
¿Alguien sabe la lista completa de caracteres que pueden usarse dentro de un GET sin estar codificados? En este momento estoy usando AZ az y 0-9 ... pero estoy buscando la lista completa.
También estoy interesado en si hay una especificación lanzada para la próxima incorporación de las URL en chino y en árabe (ya que obviamente eso tendrá un gran impacto en mi pregunta)
De here
Por lo tanto, solo los caracteres alfanuméricos, los caracteres especiales
$-_.+!*''(),
Y los caracteres reservados utilizados para sus fines reservados se pueden usar sin codificar dentro de una URL.
De la especificación RFC 1738 :
Por lo tanto, solo los caracteres alfanuméricos, los caracteres especiales "
$-_.+!*''(),
" Y los caracteres reservados utilizados para sus fines reservados se pueden usar sin codificar dentro de una URL.
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, lamentablemente no se puede copiar y pegar fácilmente, pero haré todo lo posible.
En primer orden coincidente:
host = IP-literal / IPv4address / reg-name
IP-literal = "[" ( IPv6address / IPvFuture ) "]"
IPvFuture = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" )
IPv6address = 6( h16 ":" ) ls32
/ "::" 5( h16 ":" ) ls32
/ [ h16 ] "::" 4( h16 ":" ) ls32
/ [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32
/ [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32
/ [ *3( h16 ":" ) h16 ] "::" h16 ":" ls32
/ [ *4( h16 ":" ) h16 ] "::" ls32
/ [ *5( h16 ":" ) h16 ] "::" h16
/ [ *6( h16 ":" ) h16 ] "::"
ls32 = ( h16 ":" h16 ) / IPv4address
; least-significant 32 bits of address
h16 = 1*4HEXDIG
; 16 bits of address represented in hexadecimal
IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet
dec-octet = DIGIT ; 0-9
/ %x31-39 DIGIT ; 10-99
/ "1" 2DIGIT ; 100-199
/ "2" %x30-34 DIGIT ; 200-249
/ "25" %x30-35 ; 250-255
reg-name = *( unreserved / pct-encoded / sub-delims )
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" <---This seems like a practical shortcut, most closely resembling original answer
reserved = gen-delims / sub-delims
gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
sub-delims = "!" / "$" / "&" / "''" / "(" / ")"
/ "*" / "+" / "," / ";" / "="
pct-encoded = "%" HEXDIG HEXDIG
El próximo cambio es para nombres de dominio chinos, árabes, no URI. Los URI internacionalizados se denominan IRI y se definen en RFC 3987 . Sin embargo, una vez dicho esto, recomendaría no hacerlo usted mismo sino confiar en una biblioteca existente y probada ya que hay muchas opciones de codificación / decodificación URI y lo que se considera seguro por especificación, frente a lo que es seguro por uso real (navegadores) .
Estos se enumeran en RFC3986 . Consulte el ABNF recopilado para URI para ver qué está permitido en dónde y la regex para analizar / validar.
La lista completa de los 66 caracteres sin reserva se encuentra en RFC3986, aquí: http://tools.ietf.org/html/rfc3986#section-2.3
Este es cualquier personaje en el siguiente conjunto:
[A-Za-z0-9_.-~]
Lo probé solicitando a mi sitio web (apache) todos los caracteres disponibles en mi teclado alemán como parámetro de URL:
http://example.com/?^1234567890ß´qwertzuiopü+asdfghjklöä#<yxcvbnm,.-°!"§$%&/()=? `QWERTZUIOPÜ*ASDFGHJKLÖÄ/'>YXCVBNM;:_²³{[]}/|µ@€~
Estos no fueron codificados:
^0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.-!/()=?`*;:_{}[]/|~
No codificado después de urlencode()
:
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_
No codificado después de rawurlencode()
:
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~
Nota: Antes de PHP 5.3.0 rawurlencode()
codificado ~
debido a RFC 1738 . Pero esto fue reemplazado por RFC 3986 por lo que es seguro de usar, ahora. Pero no entiendo por qué, por ejemplo, {}
están codificados a través de rawurlencode()
porque no se mencionan en RFC 3986.
Una prueba adicional que realicé fue sobre el enlace automático en mensajes de texto. Probé Mozilla Thunderbird, aol.com, outlook.com, gmail.com, gmx.de y yahoo.de y vincularon completamente las URL que contienen estos caracteres:
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~+#,%&=*;:@
Por supuesto, el ?
también estuvo vinculado, pero solo si se usó una vez.
Algunas personas ahora sugerirían usar solo los caracteres rawurlencode()
, pero ¿alguna vez oyeron 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
Más
https://plus.google.com/+google
Al signo, Colón, Coma y Signo de exclamación
https://www.google.com/maps/place/USA/@36.2218457,...
Por eso, estos caracteres deben ser utilizables sin codificar sin problemas. Por supuesto, no deberías usar &;
debido a las secuencias de codificación como &
. La misma razón es válida para %
como solía codificar caracteres en general. Y =
como asigna un valor a un nombre de parámetro.
Finalmente, diría que está bien usar estos sin codificar:
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~!+,*:@
¡Pero si espera URLs generadas aleatoriamente, no debería usarlas .!
, porque marcan el final de una oración y algunas aplicaciones de correo no vinculan automáticamente el último carácter de la url. Ejemplo:
Visit http://example.com/foo=bar! !
RFC3986 define dos conjuntos de caracteres que puede usar en un URI:
Caracteres reservados
:/?#[]@!$&''()*+,;=
reserved = gen-delims / sub-delims
gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
sub-delims = "!" / "$" / "&" / "''" / "(" / ")" / "*" / "+" / "," / ";" / "="
El objetivo de los caracteres reservados es proporcionar un conjunto de caracteres delimitadores que se distingan de otros datos dentro de un URI. Los URI que difieren en el reemplazo de un carácter reservado con su correspondiente octeto con porcentaje de codificación no son equivalentes.
Caracteres no reservados :
A-Za-z0-9-_.~
sin reserva = ALPHA / DIGIT / "-" / "." / "_" / "~"
Los caracteres que están permitidos en un URI pero no tienen un propósito reservado se llaman sin reservas.