Требуется ли номер порта в параметре заголовка HTTP «Host»? - PullRequest
45 голосов
/ 29 июля 2010

Скажем, я делаю HTTP-запрос к: foosite.com, но порт, на который я фактически отправляю запрос, - 6103, и я НЕ помещаю этот порт в заголовок Host, например:

GET /barpage HTTP/1.1
Host: foosite.com
Method: GET

Должен ли http-сервер распознавать, что я пытаюсь поговорить с ним по порту 6103?Или, поскольку это было опущено в заголовке запроса, я играю, если сервер на самом деле распознает это?

Я задаю этот вопрос, чтобы сказать следующее: я обнаружил, что браузеры, по крайней мере Firefox + Chrome, поставили портв заголовке Host.Но я не использую приложение Java.И когда порт не передается в Host, сервер отвечает обратно, думая, что я на 80-м порту. Так кому мне нужен барсук?Оператор сервера или программист на Java?

Ответы [ 4 ]

52 голосов
/ 29 июля 2010

См. раздел 14.23 спецификации HTTP , который указывает, что порт # должен быть включен, если он не является портом по умолчанию, равным 80.

7 голосов
/ 04 октября 2013

ОБНОВЛЕНО для современных браузеров:

Браузеры (и curl) будут добавлять порт только тогда, когда он не является стандартным портом, как того требует спецификация HTTP и отметили в ответе @ superfell .

Браузеры в этот день (2013), на самом деле извлекают порт из заголовка узла, когда порт является стандартным (httpпорт 80, https порт 443).Некоторые клиенты, которые используют свой собственный метод, например Baidu Spider, включают номер порта, даже если порт 80 .

Является ли это правильным или нет, я не знаю.В спецификации не сказано, нормально ли включать номер порта, если используемый порт по умолчанию.

Чтобы ответить на ваш комментарий , серверы будут делать все, что им нужно длясоответствовать спецификации, и в спецификации предлагаются только те случаи, когда это необходимо.Из-за этого я чувствую На самом деле вопрос не в том, как с этим справится сервер, а в том, как клиент выдает запрос: включает номер порта в заголовок узла или нет.

0 голосов
/ 04 декабря 2018

Пример заголовков фактического запроса к, предположительно, несуществующему серверу 'http://myhost.com:3003/content/page.htm'

Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: en-US;q=0.9,en;q=0.8,nb;q=0.7,de;q=0.6
Connection: keep-alive
Host: myhost.com:3244
Referer: http://myhost.com:3244/content/page.htm

RFC https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html требует некоторого обучения чтению.

Раздел 14:24 Не так просто перевести все элементы в простую реальность:

Host = "Host" ":" host [ ":" port ] ;
0 голосов
/ 26 октября 2018

RFC2616 утверждает, что

«Хост» без информации о заднем порте подразумевает значение по умолчанию порт для запрашиваемой услуги (например, «80» для HTTP-URL). За Например, запрос на исходный сервер для http://www.w3.org/pub/WWW/ будет правильно включать:

GET /pub/WWW/ HTTP/1.1
Host: www.w3.org

Это означает, что https://example.com также не потребуется конечный порт, поскольку порт по умолчанию известен как https. Я проверил HTTP-запросы от Firefox, Chrome и Edge и обнаружил, что ни один из них не добавил номер порта для заголовка узла, когда протоколь домена был https. Конечно, номер порта добавляется, когда номер порта также добавляется в URL. Следующие скриншоты ниже взяты из Google Chrome

Host header for a HTTP 1.1 request using https procotole Host header for a HTTP 1.1 resquest using a https with a port number in the URL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...