Я хочу перенаправить определенный URI на новый на том же сервере. Это можно сделать, отправив ответ с кодом 3xx и заголовком Location. Теперь стандарт HTTP / 1.1 требует, чтобы это был «абсолютный URI». (видеть http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.30)
Что именно они подразумевают под «абсолютным URI»? В приведенном примере они включали полный URI с протоколом, именем хоста и путем. Теперь я хочу перенаправить на URI на том же сервере и знаю путь. Это абсолютный URI (он начинается с корня), но без имени хоста и протокола. Фактически, сервер может не знать своего собственного имени хоста, и было бы сложно построить полный URI.
Допустимо ли в соответствии со стандартом HTTP / 1.1 отправлять URI без имени хоста и протокола? Я пробовал это, и все браузеры, которые я тестировал, казалось, понимали это. У меня вопрос: правильно ли это делать?
Пример ответа:
HTTP/1.1 303 See Other
Location: /path/to/other
Вместо того:
HTTP/1.1 303 See Other
Location: https://hostname.com/path/to/other
Допустимо ли в соответствии со стандартом HTTP / 1.1 отправлять URI [в заголовке местоположения] без имени хоста и протокола?
Нет, из-за того, как определяется «absoluteURI». Поскольку вы смотрите на RFC, давайте придерживаться их в этом обсуждении. Резервное копирование:
Что именно они подразумевают под «абсолютным URI»?
Это определено в другом месте. Это случилось довольно часто.
Теперь я хочу перенаправить на URI на том же сервере и знаю путь. Это абсолютный URI (он начинается с корня), но без имени хоста и протокола.
Это может быть абсолют дорожка, но это не делает его абсолютным URI.
Из раздела 3.2.1 HTTP / 1.1 RFC, Общий синтаксис:
Для получения полной информации о синтаксисе и семантике URL-адресов см. «Uniform Resource Identifiers (URI): Generic Syntax and Semantics», RFC 2396 [42] (который заменяет RFC 1738 [4] и RFC 1808 [11]). Эта спецификация принимает определения «URI-ссылка», «absoluteURI», «relativeURI», «port», «host», «abs_path», «rel_path» и «Authority» из этой спецификации.
Смотря на RFC 2396:
absoluteURI = scheme ":" ( hier_part | opaque_part )
Даже не углубляясь в BNF, требуется «схема» («http» или «https»). Я опущу здесь фактическое обсуждение построения правил, но, поскольку вам нужны «http:» или «https:» в начале строки, вы не можете удалить сетевую часть URI.
Я пробовал это, и все браузеры, которые я тестировал, казалось, понимали это.
Закон Постела на работе. Вы сделали что-то не так, но браузер все равно это понял. Вы должны следовать ему и отправить правильный абсолютный URI с вашим Location:
заголовок. Если это не может быть легко построено в вашей среде, что-то не так; Я не могу вспомнить ни одного веб-приложения, которое я видел, где информацию о хосте нельзя было бы настроить или получить.
Похоже, они не сказали явно, следует ли включать имя сервера и протокол. Если вы знаете, кто будет использовать ваш HTTP-сервис, вы можете просто протестировать его и посмотреть, все ли идет хорошо.
Кроме того, нетрудно узнать запрошенный URL-адрес на сервере и построить абсолютный URL-адрес, который включает протокол и имя хоста. Например, вы можете использовать $_SERVER
массив в PHP. Другие веб-языки должны иметь аналогичные предварительно определенные переменные.