Назад | Перейти на главную страницу

HTTP / перенаправление на URI на сервере

Я хочу перенаправить определенный 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. Другие веб-языки должны иметь аналогичные предварительно определенные переменные.