¿Se permiten corchetes en las URL?

¿Se permiten corchetes en las URL?

Me di cuenta de que Apache commons HttpClient (3.0.1) arroja una IOException, wget y Firefox, pero acepta los corchetes.

Ejemplo de URL:

http://example.com/path/to/file[3].html 

Mi cliente HTTP encuentra tales URL, pero no estoy seguro de si parchear el código o lanzar una excepción (como debería ser).

RFC 3986 estados

Un host identificado por una dirección literal de Protocolo de Internet, versión 6 [RFC3513] o posterior, se distingue al encerrar el literal de IP entre corchetes (“[” y “]”). Este es el único lugar donde los caracteres de corchetes están permitidos en la syntax de URI.

Entonces, en teoría, no deberían ver tales URI en la naturaleza, ya que deberían llegar codificados.

Sé que esta pregunta es un poco antigua, pero solo quería señalar que PHP usa corchetes para pasar matrices en una URL.

 http://www.example.com/foo.php?bar[]=1&bar[]=2&bar[]=3 

En este caso, $_GET['bar'] contendrá la array(1, 2, 3) .

Cualquier navegador o software habilitado para la web que acepte URL y no arroje una excepción cuando se introducen caracteres especiales está casi garantizado que está codificando los personajes especiales detrás de las escenas. Los corchetes, corchetes, espacios, etc., todos tienen formas codificadas especiales de representarlos para no generar conflictos. Según las respuestas anteriores, la forma más segura de lidiar con esto es codificarlas mediante URL antes de entregarlas a algo que intente resolver la URL.

¿Casi los únicos caracteres no permitidos en los nombres de ruta son # y? ya que significan el final del camino.

El uri rfc tendrá la respuesta definitiva:

http://www.ietf.org/rfc/rfc1738.txt

Inseguro:

Los personajes pueden ser inseguros por varias razones. El carácter de espacio no es seguro porque los espacios significativos pueden desaparecer y se pueden introducir espacios insignificantes cuando las URL se transcriben o se comstackn tipográficamente o se someten al tratamiento de progtwigs de procesamiento de textos. Los caracteres “<" y ">” no son seguros porque se usan como delimitadores de las URL en texto libre; la marca de comillas (“” “) se utiliza para delimitar URL en algunos sistemas. El carácter” # “no es seguro y siempre debe codificarse porque se usa en World Wide Web y en otros sistemas para delimitar una URL de un fragmento / ancla. identificador que podría seguirlo. El carácter “%” no es seguro porque se usa para codificaciones de otros caracteres. Otros caracteres no son seguros porque se sabe que las puertas de enlace y otros agentes de transporte modifican a veces dichos caracteres. Estos caracteres son “{“, “} “,” | “,” \ “,” ^ “,” ~ “,” [“,”] “y” `”.

Todos los caracteres inseguros siempre deben estar codificados dentro de una URL. Por ejemplo, el carácter “#” debe estar codificado dentro de las URL, incluso en sistemas que normalmente no se ocupan de identificadores de fragmentos o anclajes, de modo que si la URL se copia en otro sistema que sí los utiliza, no será necesario cambiar el Codificación URL

La respuesta es que deberían estar codificados en hexadecimal, pero conociendo la ley de postel, la mayoría de las cosas los aceptará textualmente.

Para utilizar la clase HttpClient commons, debe buscar en la clase org.apache.commons.httpclient.util.URIUtil, específicamente en el método encode (). Úselo para codificar URI en la URL antes de intentar recuperarla.

StackOverflow parece no codificarlos:

https://stackoverflow.com/search?q=square+brackets+%5Burl%5D

Lo mejor es codificar URL, ya que claramente no son compatibles con todos los servidores web. A veces, incluso cuando hay un estándar, no todos lo siguen.

De acuerdo con la especificación de URL , los corchetes no son caracteres de URL válidos.

Aquí están los fragmentos relevantes:

Los caracteres “nacional” y “de puntuación” no aparecen en ninguna producción y, por lo tanto, pueden no aparecer en las URL.
nacional {| } | vline | [| ] | \ | ^ | ~
puntuación <| >

Los corchetes [ y ] en las URL no son a menudo compatibles.

Reemplácelos por %5B y %5D :

  • Usando una línea de comando, el siguiente ejemplo se basa en bash y sed :

     url='http://example.com?day=[0-3][0-9]' encoded_url="$( sed 's/\[/%5B/g;s/]/%5D/g' <<< "$url")" 
  • Usando Java URLEncoder.encode(String s, String enc)

  • Usando PHP rawurlencode() o urlencode()

     '; ?> 

    salida:

      

    o:

     '; ?> 
  • Usando su lenguaje de progtwigción favorito ... Extienda esta respuesta publicando un comentario o editando directamente esta respuesta para agregar la función que utiliza desde su lenguaje de progtwigción 😉

Para obtener más detalles, consulte el RFC 3986 que especifica la syntax de URL. El Apéndice A es sobre el %-encoding en la cadena de consulta (corchetes como pertenecientes a "gen-delims" para ser %-encoded ).

Los corchetes se consideran inseguros, pero la mayoría de los navegadores los analizarán correctamente. Dicho esto, es mejor reemplazar los corchetes con algunos otros caracteres.