2009-12-06 44 views
143

¿Alguien sabe la lista completa de caracteres que se pueden usar dentro de un GET sin estar codificados? En este momento estoy usando A-Z a-z y 0-9 ... pero estoy buscando la lista completa.Caracteres permitidos en una URL

También estoy interesado en si existe una especificación lanzado para el hasta que viene adición de chino, árabe url (como, obviamente, que tendrá un gran impacto en mi pregunta)

+3

Los caracteres permitidos en un URI se reservan ya sea '* '();:!?. @ Y = + $,/# []' 'sin reservas o A-Za-z0-9_ ~ - '(o un carácter de porcentaje'% 'como parte de un porcentaje de codificación) – Mikl

+0

En MySQL utilizo este' REGEXP '[^] A-Za-z0-9_. ~! *' '();: @ & = + $, /? # [% -] + ''para buscar una cadena URL con caracteres incorrectos. Tal vez sea útil para otra persona también. – Mikl

Respuesta

138

De RFC 1738 especificación:

Por lo tanto, ser alfanuméricos, los caracteres especiales "$-_.+!*'(),", y caracteres reservados utilizados para sus fines reservadas se pueden usar sin codificar dentro de un URL.

EDITAR: Como @Jukka K. Korpela señala correctamente, esta RFC se actualizó 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 emparejado:

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 
+1

¿Qué tal una barra diagonal? –

+5

@Tim slash es un carácter reservado, por lo tanto, si se utiliza para su propósito reservado (delinear rutas, delineación de protocolo ...), entonces no es necesario que escape. De lo contrario, lo hace. – Myles

+3

Las reglas de sintaxis genéricas de RFC 1738 fueron obsoletas en 1998. –

37

los caracteres permitidos en un URI son o bien reservada o no reservada (o un carácter de porcentaje como parte de un código porciento)

http://en.wikipedia.org/wiki/Percent-encoding#Types_of_URI_characters

dice que estos son RFC 3986mf caracteres errados (sec. 2.3) así como caracteres reservados (sec 2.2) si necesitan conservar su significado especial. Y también un carácter de porcentaje como parte de un porcentaje de codificación.

+5

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. –

+0

@ j.a.estevan Citación del documento vinculado: 'Los caracteres permitidos en un URI son reservados o sin reserva (o un carácter de porcentaje como parte de una codificación porcentual)' – Mikl

10

De here

Por lo tanto, ser alfanuméricos, los caracteres especiales $-_.+!*'(), y caracteres reservados utilizados para sus propósitos reservados pueden ser usados ​​sin codificar dentro de un URL.

3

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) .

17

La lista completa de los 66 caracteres sin reservas está en RFC3986, aquí: http://tools.ietf.org/html/rfc3986#section-2.3

Ésta es cualquier carácter en el siguiente conjunto:

[A-Za-z0-9_.-~] 
+1

Puede usar los reservados también. – Qwerty

+0

El RFC1738 obsoleto enumeró '{}^\ ~' y 'backtick' como inseguro. Y RFC3986 enumera \ como inseguro debido al sistema de archivos. Esto significa que '{} ^' podría usarse también. – mgutt

3

RFC3986 define dos conjuntos de caracteres que se pueden utilizar en una URI:

  • caracteres reservados: :/?#[]@!$&'()*+,;=

    reservados = Gen-delims/sub-delims

    Gen-delims = ": "?""/"/"// "#"/"["/"]"/"@"

    sub-delims = "!"/"$"/"&"/"'"/"("/")"/"*"/"+"/","/";"/"="

    El propósito 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 reservas = ALPHA/DIGIT/"-"/""./"_"/"~"

    Los caracteres que están permitidos en un URI pero que no tienen un propósito reservado se llaman sin reservas.

5

he comprobado mediante la solicitud de mi sitio web (Apache) con todos los caracteres disponibles en mi teclado alemán como parámetro URL:

http://example.com/?^1234567890ß´qwertzuiopü+asdfghjklöä#<yxcvbnm,.-°!"§$%&/()=? `QWERTZUIOPÜ*ASDFGHJKLÖÄ\'>YXCVBNM;:_²³{[]}\|µ@€~ 

Estos no fueron codificados:

^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.-!/()=?`*;:_{}[]\|~ 

No codificado después de urlencode():

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_ 

no codificados después rawurlencode():

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~ 

Nota: Antes de PHP 5.3.0 rawurlencode() codificado ~ debido RFC 1738. Pero esto fue reemplazado por RFC 3986 por lo que es seguro de usar, ahora. Pero no entiendo por qué, por ejemplo, {} se codifican a través rawurlencode() debido a que no se mencionan en el documento RFC 3986.

una prueba adicional que hice fue con respecto de auto-enlace en los textos de correo. Probé Mozilla Thunderbird, aol.com, outlook.com, gmail.com, gmx.de y yahoo.y ellos de URLs totalmente vinculados contienen estos caracteres:

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~+#,%&=*;:@ 

Por supuesto, el ? estaba ligado, también, pero sólo si se ha utilizado una vez.

Algunas personas ahora sugerirían usar solo los caracteres rawurlencode(), pero ¿alguna vez escuchó que alguien tuvo problemas para abrir estos sitios web?

asterisco
http://wayback.archive.org/web/*/http://google.com

Colón
https://en.wikipedia.org/wiki/Wikipedia:About

Plus
https://plus.google.com/+google

En la muestra, de colon, coma y signo de exclamación
https://www.google.com/maps/place/USA/@36.2218457,...

Debido a que estos caracteres deben ser sin codificar utilizable sin problemas. Por supuesto, no debe usar &; debido a secuencias de codificación como &amp;. El mismo motivo es válido para % ya que solía codificar caracteres en general. Y =, ya que asigna un valor a un nombre de parámetro.

Por último, diría que es aceptable utilizar estos sin codificar:

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~!+,*:@ 

pero si esperas generadas de forma aleatoria URL no se debe utilizar .!, porque aquellos marcar el final de una oración y algunas aplicaciones de correo no será automática -link el último carácter de la url. Ejemplo:

Visit http://example.com/foo=bar! ! 
Cuestiones relacionadas