Ответ 1
См. раздел 14.23 спецификации HTTP, который указывает, что порт # должен быть включен, если он не является портом по умолчанию 80.
Скажем, я делаю HTTP-запрос к: foosite.com
но порт, на который я фактически отправляю запрос, это 6103, и я НЕ помещаю этот порт в заголовок Host
например:
GET /barpage HTTP/1.1
Host: foosite.com
Method: GET
Должен ли http-сервер распознать, что я пытаюсь связаться с ним по порту 6103? Или, так как это было опущено в заголовке запроса, я играю, если сервер фактически распознает это?
Я задаю этот вопрос, чтобы сказать следующее: я обнаружил, что браузеры, по крайней мере, Firefox + Chrome, поместили порт в заголовок Host
. Но я не использую приложение Java. И когда порт не передается Host
сервер отвечает обратно, думая, что я на порте 80. Так кому же мне нужен барсук? Оператор сервера или программист на Java?
См. раздел 14.23 спецификации HTTP, который указывает, что порт # должен быть включен, если он не является портом по умолчанию 80.
ОБНОВЛЕНО для современных браузеров:
Браузеры (и завиток) добавят порт только в том случае, если он не является стандартным портом, как того требует спецификация HTTP и указан в ответе @superfell.
Браузеры в этот день (2013), фактически лишат порт из заголовка хоста, когда порт является стандартным (http-порт 80, https-порт 443). Некоторые клиенты, которые используют свой собственный метод, например Baidu Spider, включают номер порта, даже если порт равен 80.
Является ли это правильным или нет, я не знаю. Спецификация не говорит, будет ли это нормально или не включать номер порта, когда используемый порт используется по умолчанию.
Чтобы ответить на ваш комментарий, серверы будут делать все, что им нужно, чтобы соответствовать спецификации, и спецификация предлагает только те случаи, КОТОРЫЕ ему нужны. Из-за этого я чувствую, что это не вопрос о том, как сервер справляется с ним - это больше, как клиент выдает запрос: включает номер порта в заголовке хоста, или нет.
В RFC2616 говорится, что
"Хост" без какой-либо дополнительной информации о портах подразумевает порт по умолчанию для запрошенной услуги (например, "80" для URL-адреса HTTP). Например, запрос на исходном сервере для 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://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 ] ;