Existe una ambigüedad conceptual sutil cuando la gente dice "URI relativo".
Según la definición de RFC3986 , un URI genérico contiene:
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
hier-part = "//" authority path-abempty
/ path-absolute
/ path-rootless
/ path-empty
foo://example.com:8042/over/there?name=ferret#nose
\_/ \______________/\_________/ \_________/ \__/
| | | | |
scheme authority path query fragment
Lo complicado es que, cuando se omiten el esquema y la autoridad, la parte de la "ruta" en sí misma puede ser una ruta absoluta (comienza con /
) o una ruta relativa "sin raíces". Ejemplos:
- Un URI absoluto o un URI completo:
"http://example.com:8042/over/there?name=ferret"
- Y este es un uri relativo, con ruta absoluta :
/over/there
- Y este es un uri relativo, con ruta relativa :
here
o ./here
o ../here
o etc.
Entonces, si la pregunta era "si un servidor debería producir una ruta relativa en una respuesta tranquila", la respuesta es "No" y la razón detallada está disponible aquí . Creo que la mayoría de las personas (incluyéndome a mí) en contra de "URI relativo" están en realidad en contra de "ruta relativa".
Y en la práctica, la mayoría de los marcos MVC del lado del servidor pueden generar fácilmente un URI relativo con una ruta absoluta como /absolute/path/to/the/controller
, y la pregunta es "si la implementación del servidor debe anteponer un prefijo a scheme://hostname:port
la ruta absoluta". Como la pregunta del OP. No estoy muy seguro de este.
Por un lado, sigo pensando que se recomienda que el servidor devuelva un uri completo. Sin embargo, el servidor nuncahostname:port
debería codificar lo que está dentro del código fuente como este (de lo contrario, preferiría recurrir a un uri relativo con una ruta absoluta). La solución es que el lado del servidor siempre obtenga ese prefijo del encabezado "Host" de la solicitud HTTP. Sin embargo, no estoy seguro de si esto funciona para todas las situaciones.
Por otro lado, no parece muy problemático para el cliente concatenar el http://example.com:8042
y la ruta absoluta. Después de todo, el cliente ya conoce ese esquema y el nombre de dominio cuando envía la solicitud al servidor, ¿verdad?
Con todo, yo diría que recomiendo usar un URI absoluto, posiblemente un retroceso al URI relativo con una ruta absoluta, nunca use una ruta relativa .