HTTP的“Host”头参数中是否需要端口号?

60

假设我向 foosite.com 发送了一个HTTP请求,但实际发送请求的端口是6103,我没有在 Host 头部中放置该端口,例如:

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

我的http服务器是否应该认识我是在6103端口上与其通信?或者,由于请求头中省略了它,我是在赌服务器是否真正识别它?

我问这个问题是为了表达这个意思:我发现至少firefox + chrome浏览器将端口放在Host头中。但我使用的Java应用程序没有这样做。当端口没有传递到Host时,服务器响应会认为我在80端口上。那么我需要找谁来解决这个问题?服务器操作员还是Java程序员?


6
6103是一个奇怪的HTTP端口。 - NullUserException
我同意@NullUserException的观点。HTTP默认端口是80,因此我建议您与Java开发人员联系,确保他们在调用中包含非标准端口。 - kbrimington
这是一个基本的房地产列表API服务,具体来说是RETS http://www.rets.org/documentation。提供RETS多个列表服务的公司往往会给它们子域或端口,例如socalmls.someretscompany.com或someretscompany.com:6111。不要问我为什么他们使用端口。我只是在这里工作 ;) - Jon Mabe
是的,服务器可以使用实际连接的端口号。事实上,为了可重用性,服务器必须这样做。否则会出现安全错误(例如:防火墙阻止除受信任客户端外的端口81;不受信任的客户端连接到端口80并发送主机:1.2.3.4:81)。服务器可以通过多种方式检测端口号 - 最简单的方法可能是检查它从哪个侦听套接字accept()传入连接... - DimeCadmium
5个回答

74

参见HTTP规范的第14.23节,该节规定如果端口不是默认端口(HTTP为80,HTTPS为443),则应包括端口号。


2
是的,我也在 RFC 中读到了这一点。我可能应该注意到这一点。我希望有人能够说出一些具体了解某些 Web 服务器和 Web 应用程序框架如何处理此类请求的知识,例如:“一些Web服务器/应用程序框架可以处理它,但是X和Y不行”等等。最终,我希望接受 RFC 所说的内容,但是在放弃之前,我会再等待一天看看是否有答案。 - Jon Mabe
谢谢,现在我知道这是IE11移动版中的一个错误! - Eric
3
需要澄清的是RFC规定,如果不是协议的默认端口,则需要指定端口。例如,对于HTTP协议,默认端口为80;而对于HTTPS协议,默认端口为443(即在HTTPS请求中可能不包括443端口)。请注意保持原意并简化语言。 - Jmons

9

针对现代浏览器进行更新:

浏览器(以及curl)只有在端口不是标准端口时才会添加端口,这是由HTTP规范要求并在@superfell的答案中提到的。

现在的浏览器(2013年),实际上会从“主机”头信息中删除标准端口(http 80端口和https 443端口)的端口号。一些使用自己方法的客户端,例如百度蜘蛛,即使端口是80,也包括端口号

是否正确,我不知道。该规范没有说明在使用默认端口时是否可以包括端口号。

回答您的评论,服务器将执行其需要遵守规范的所有操作,并且规范仅建议必要的情况。因此,我认为问题不在于服务器如何处理它——而更多的是客户端如何发出请求:包括主机头中的端口号还是不包括。


1
规范明确说明可以包括端口号(命名机构包括端口),即端口号是必需的,除非它是服务的默认值。 - Remember Monica
1
我想补充一点:我注意到一些代理或充当反向代理的Web服务器可能会重写这个。使用NGINX前置应用程序服务器的常见配置是设置主机标头和冒号。在此配置下运行时,最终结果是浏览器执行的内容与各种Web代理、WAF和Web服务器在标头被任何应用程序代码接收之前对其进行的操作的组合。 - Jmons
我注意到,如果你加载 http://www.facebook.com:80/example 并在主机头中包含 :80,它会将你重定向到 https://www.facebook.com:80/example,这显然是无法工作的。如果你的客户端不这样做会破坏 Facebook,所以最好还是这样做。 - user253751

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


0

主机头语法:

主机:

如果不是默认端口,则在主机后面加上端口:

主机:example.com:1337


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 ] ;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接