2011-06-22 9 views
5

Según la Section 3.3, Path Component of RFC2396 - Uniform Resource Identifiers,¿Puede algún segmento de ruta de un URI tener un componente de consulta?

La ruta puede consistir en una secuencia de segmentos de trayectoria separadas por una única barra "/" carácter. Dentro de un segmento de ruta, los caracteres "/", ";", "=" y "?" están reservados. Cada segmento de ruta puede incluir una secuencia de parámetros, indicada por el punto y coma ";" personaje. Los parámetros no son significativos para el análisis de referencias relativas.

Sin embargo, nunca he visto una URL con parámetros de consulta en ningún segmento que no sea el final. Entonces, no estoy seguro si estoy leyendo esto correctamente.

¿Es http://www.url.com/segment1?seg1param1=val1/page.html?pageparam1=val2 una URL válida?

Respuesta

8

Lo que el RFC se refiere es algo como esto:

http://www.example.com/foo/bar;param=value/baz.html 

que podría interpretarse como el camino /foo/bar/baz.html con el parámetro param=value al segmento bar. No se usan signos de interrogación.

Tenga en cuenta que el RFC 2396 ya es obsoleto debido RFC 3986, que omite la especificación de los parámetros específicos del segmento en favor de una nota general de que las implementaciones pueden (y lo hacen) hacer cosas diferentes para incrustar parámetros específicos del segmento:

Aparte de segmentos de puntos en rutas jerárquicas, un segmento de ruta es considerado opaco por la sintaxis genérica. Las aplicaciones que producen URI a menudo usan los caracteres reservados permitidos en un segmento para delimitar subcomponentes específicos del esquema o del manejador de desreferencia.Para el ejemplo , los caracteres reservados de punto y coma (";") e iguales ("=") son que se usan a menudo para delimitar los parámetros y los valores de parámetros aplicables a ese segmento . El carácter reservado de coma (",") a menudo se usa para propósitos similares a . Por ejemplo, un productor de URI podría usar un segmento como "nombre; v = 1.1" para indicar una referencia a la versión 1.1 de "nombre", mientras que otro podría usar un segmento como "nombre, 1.1" para indicar el mismo. Los tipos de parámetros se pueden definir por semántica específica del esquema , pero en la mayoría de los casos la sintaxis de un parámetro es específica de la implementación del algoritmo de desreferenciación del URI.

+0

No sabía que la especificación se había quedado obsoleta. Voy a revisar el actualizado ahora. – smartcaveman

+0

Apéndice D2 "Modificaciones" también fue especialmente útil ... Muchas gracias, nunca hubiera averiguado esto simplemente leyendo la especificación obsoleta – smartcaveman

+0

si se utilizan signos de interrogación, ¿luego se convierte en una consulta? – Anthony

0

De acuerdo con mi lectura de RFC 2396, no. El ? es un carácter reservado y sirve solo para delimitar el segmento de consulta. El ? no está permitido ni en la ruta ni en el segmento de consulta.

En su ejemplo, el primer ? marca el comienzo del segmento de consulta. El segundo ? está dentro del segmento de consulta y no está permitido.

0

Creo que podría conseguirlo y la mayoría de los servidores web lo procesarían, pero no creo que obtenga los resultados que espera. Esa es la página param1 = val2 no evaluaría.

Si desea parámetros como ese, siempre puede usar el símbolo # (como lo hacen ahora muchas GUI basadas en JavaScript).

1

Cuando nos fijamos en la gramática que es justo por debajo, está escrito:

path   = [ abs_path | opaque_part ] 

    path_segments = segment *("/" segment) 
    segment  = *pchar *(";" param) 
    param   = *pchar 

    pchar   = unreserved | escaped | 
        ":" | "@" | "&" | "=" | "+" | "$" | "," 

Un segmento se compone de pchar y parámetro, parámetro de ser en sí mismo un pchar. Cuando continuamos leyendo, no hay absolutamente ningún "?" carácter en los componentes del personaje pchar. Entonces los parámetros no pueden tener ningún "?", Y no puede haber un "?" en segmentos.

Así que estoy de acuerdo con la respuesta de Edward Thomson, quien dice que "?" solo delimite el segmento de consulta y no se puede usar dentro de una ruta.

Cuestiones relacionadas