Es un colon `:` seguro para el uso amigable de URL?

Estamos diseñando un sistema de URL que especificará las secciones de la aplicación como palabras separadas por barras. Específicamente, esto está en GWT, por lo que las partes relevantes de la URL estarán en el hash (que será interpretado por una capa de controlador en el lado del cliente):

http://site/gwturl#section1/section2 

Algunas secciones pueden necesitar atributos adicionales, que nos gustaría especificar con un : modo que las partes de la sección de la URL no sean ambiguas. El código se dividiría primero en / y luego en : esta manera:

 http://site/gwturl#user:45/comments 

Por supuesto, estamos haciendo esto para la compatibilidad con la url, por lo que nos gustaría asegurarnos de que ninguno de estos caracteres que tengan un significado especial sea codificado en URL por los navegadores, o cualquier otro sistema, y ​​terminan con una url como esta:

 http://site/gwturl#user%3A45/comments <--- BAD 

¿Utilizar los dos puntos de este modo es seguro (con lo que quiero decir que no se codificará automáticamente) para navegadores, sistemas de marcadores, incluso código JavaScript o Java?

Recientemente escribí un codificador URL, así que esto es bastante fresco en mi mente.

http://site/gwturl#user:45/comments

Todos los personajes en la parte del fragmento ( user:45/comments ) son perfectamente legales para RFC 3986 URI.

Las partes relevantes del ABNF :

 fragment = *( pchar / "/" / "?" ) pchar = unreserved / pct-encoded / sub-delims / ":" / "@" unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" pct-encoded = "%" HEXDIG HEXDIG sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "=" 

Además de estas restricciones, la parte del fragmento no tiene una estructura definida más allá de la que le da su aplicación. El esquema, http, solo dice que no envía esta parte al servidor.


EDITAR:

D’oh!

A pesar de mis afirmaciones sobre la especificación de URI, irrecutable proporciona la respuesta correcta cuando señala que la especificación de HTML 4 restringe los nombres / identificadores de los elementos .

Tenga en cuenta que las reglas de identificación están cambiando en HTML 5 . Las restricciones de URI se seguirán aplicando (al momento de escribir, hay algunos problemas sin resolver sobre el uso de URI por parte de HTML 5).

Además del análisis de McDowell sobre el estándar URI, recuerde también que el fragmento debe ser un nombre de ancla HTML válido. De acuerdo con http://www.w3.org/TR/html4/types.html#type-name

Los tokens de ID y NAME deben comenzar con una letra ([A-Za-z]) y pueden ir seguidos de cualquier cantidad de letras, dígitos ([0-9]), guiones (“-“), guiones bajos (“_”) , dos puntos (“:”) y puntos (“.”).

Entonces estás de suerte. “:” está explícitamente permitido. Y nadie debería “%” – escapar, no solo porque “%” es ilegal char allí, sino también porque el fragmento coincide mucho con el nombre de anclaje char-by-char, por lo tanto, ningún agente debe tratar de atenuarse con ellos de todos modos.

Sin embargo, debes probarlo. Los estándares web no se siguen estrictamente, a veces los estándares son contradictorios. Por ejemplo, HTTP / 1.1 RFC 2616 no permite la cadena de consulta en la URL de solicitud, mientras que HTML construye una al enviar un formulario con el método GET. Cualquiera que sea implementado en el mundo real gana al final del día.

MediaWiki y otros motores de wiki usan dos puntos en sus URL para designar espacios de nombres, aparentemente sin mayores problemas.

por ejemplo, http://en.wikipedia.org/wiki/Template:Welcome

No contaría con eso. Es probable que muchos usuarios-agente lo codifiquen como %3A .

Desde URLEncoder javadoc:

Para obtener más información sobre la encoding de formularios HTML, consulte la especificación HTML.

Al codificar una Cadena, se aplican las siguientes reglas:

  • Los caracteres alfanuméricos “a” a “z”, “A” a “Z” y “0” a “9” siguen siendo los mismos.
  • Los caracteres especiales “.”, “-“, “*” y “_” siguen siendo los mismos.
  • El carácter de espacio “” se convierte en un signo más “+”.
  • Todos los demás caracteres son inseguros y se convierten primero en uno o más bytes utilizando algún esquema de encoding. Entonces cada byte se representa con la cadena de 3 caracteres “% xy”, donde xy es la representación hexadecimal de dos dígitos del byte. El esquema de encoding recomendado para usar es UTF-8. Sin embargo, por razones de compatibilidad, si no se especifica una encoding, entonces se utiliza la encoding predeterminada de la plataforma.

Es decir,: no es seguro.

No veo que Firefox o IE8 codifiquen algunas de las URL de Wikipedia que incluyen el personaje.

Los puntos se usan como la división entre el nombre de usuario y la contraseña si un protocolo requiere autenticación.

Colon no es seguro. Mira aquí

No es un carácter seguro y se usa para distinguir a qué puerto se conecta cuando está justo después de su nombre de dominio.