Когда люди говорят «относительный URI», возникает тонкая концептуальная двусмысленность.
По определению RFC3986 универсальный URI содержит:
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
Сложность в том, что когда схема и авторитет опущены, сама часть «пути» может быть либо абсолютным путем (начинается с /
), либо относительным путем «без корня». Примеры:
- Абсолютный URI или полный URI:
"http://example.com:8042/over/there?name=ferret"
- И это относительный uri с абсолютным путем :
/over/there
- И это относительный uri с относительным путем :
here
or ./here
or ../here
or etc.
Итак, если вопрос был в том, «должен ли сервер выдавать относительный путь в спокойном ответе», ответ будет «Нет», и подробные сведения о причине доступны здесь . Я думаю, что большинство людей (включая меня) против «относительного URI» на самом деле против «относительного пути».
И на практике большая часть серверной инфраструктуры MVC может легко сгенерировать относительный URI с абсолютным путем, например /absolute/path/to/the/controller
, и возникает вопрос, «должна ли реализация сервера префикс a scheme://hostname:port
перед абсолютным путем». Как вопрос ОП. Я не совсем уверен в этом.
С одной стороны, я по-прежнему считаю, что сервер, возвращающий полный uri, рекомендуется. Однако сервер никогда неhostname:port
должен жестко кодировать что- то внутри исходного кода, подобного этому (в противном случае я бы предпочел вернуться к относительному uri с абсолютным путем). Решение заключается в том, что серверная сторона всегда получает этот префикс из заголовка HTTP-запроса "Host". Не уверен, работает ли это для всех ситуаций.
С другой стороны, для клиента не составляет большого труда объединить http://example.com:8042
абсолютный путь и. В конце концов, клиент уже знает эту схему и доменное имя, когда отправляет запрос на сервер, верно?
В целом, я бы сказал, рекомендую использовать абсолютный URI, возможно, вернуться к относительному URI с абсолютным путем, никогда не использовать относительный путь .