Требуется ли номер порта в параметре заголовка HTTP "Host"?

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

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

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

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

5 ответов

Решение

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

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

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

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

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

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

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

Заголовок хоста для запроса HTTP 1.1 с использованием https procotole Заголовок узла для запроса HTTP 1.1 с использованием https с номером порта в URL

Примеры заголовков фактического запроса к, предположительно, несуществующему серверу ' 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 ] ;

Синтаксис заголовка хоста:

Хозяин: :

если это не по умолчанию, то укажите порт после хоста:

Хост: example.com:1337

Другие вопросы по тегам