HTTP“主机”标头参数中是否需要端口号?

时间:2010-07-29 15:21:57

标签: http http-headers

假设我向foosite.com发出HTTP请求,但实际发送请求的端口是6103,我不会将该端口放在Host标头中,例如:

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

http服务器应该知道我正在尝试在端口6103上与它通话吗?或者因为它在请求标题中被省略了,所以如果服务器实际识别出这个,我会赌博吗?

我问这个问题:我发现浏览器,至少是firefox + chrome,将端口放在Host标头中。但我正在使用的Java应用程序没有。当端口未在Host中传递时,服务器会回复以为我在端口80上。所以我需要獾?服务器操作员,还是Java程序员?

5 个答案:

答案 0 :(得分:52)

请参阅section 14.23 of the HTTP spec,其中指定如果不是默认端口80,则应包含端口#。

答案 1 :(得分:7)

为现代浏览器更新:

浏览器(和curl)只有当它不是标准端口时才会添加端口,如HTTP spec所要求的那样,并在@ superfell的answer中注明。

今天(2013年)的浏览器,当端口是标准端口(http端口80,https端口443)时,实际上剥离端口从主机头。一些客户使用自己的方法,如百度蜘蛛,include the port number even when the port is 80

这是否合适,我不知道。当使用的端口是默认端口时,规范没有说明是否可以包含端口号。

要回答您的comment,服务器会做任何他们需要做的事情来遵守规范,并且规范只建议在需要时的情况。因此,我感觉这不是服务器如何处理它的问题 - 更多的是客户端发出请求的方式:包括主机标头中的端口号。

答案 2 :(得分:0)

RFC2616指出

  

没有任何尾随端口信息的“主机”表示默认   请求的服务的端口(例如,HTTP URL为“ 80”)。对于   例如,原始服务器上的   http://www.w3.org/pub/WWW/将正确包括:

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

这意味着https://example.com也不需要尾随端口,因为默认端口是https已知的。我检查了来自Firefox,Chrome和Edge的HTTP请求,发现当域协议为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

答案 3 :(得分:0)

对可能不存在的服务器'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 ] ;

答案 4 :(得分:0)

主机头语法:

主持人::

如果它不是默认的,则在主机之后放置端口:

主机:example.com:1337