C'è una sottile ambiguità concettuale quando le persone dicono "URI relativo".
Secondo la definizione di RFC3986 , un URI generico 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
La cosa complicata è che, quando schema e autorità vengono omessi, la parte "percorso" stessa può essere un percorso assoluto (inizia con /
) o un percorso relativo "senza radice". Esempi:
- Un URI assoluto o un URI completo:
"http://example.com:8042/over/there?name=ferret"
- E questo è un uri relativo, con percorso assoluto :
/over/there
- E questo è un uri relativo, con percorso relativo :
here
or ./here
or ../here
or ecc.
Quindi, se la domanda era "se un server deve produrre un percorso relativo in una risposta riposante", la risposta è "No" e il motivo dettagliato è disponibile qui . Penso che la maggior parte delle persone (incluso me) contro "URI relativo" sia in realtà contro "percorso relativo".
E in pratica, la maggior parte dei framework MVC lato server può facilmente generare URI relativo con un percorso assoluto come /absolute/path/to/the/controller
, e la domanda diventa "se l'implementazione del server deve anteporre a un scheme://hostname:port
davanti al percorso assoluto". Come la domanda dell'OP. Non sono abbastanza sicuro di questo.
Da un lato, penso ancora che il server che restituisce un uri completo sia consigliato. Tuttavia, il server nonhostname:port
dovrebbe mai codificare la cosa all'interno del codice sorgente come questo (altrimenti preferirei eseguire il fallback su uri relativo con percorso assoluto). La soluzione è lato server che ottiene sempre quel prefisso dall'intestazione "Host" della richiesta HTTP. Non sono sicuro che funzioni per tutte le situazioni.
D'altra parte, non sembra molto problematico per il client concatenare il http://example.com:8042
percorso assoluto e. Dopo tutto, il client conosce già quello schema e il nome di dominio quando invia la richiesta al server, giusto?
Tutto sommato, direi, consiglio di usare l'URI assoluto, possibilmente fallback all'URI relativo con percorso assoluto, non usare mai il percorso relativo .