【问题标题】:Is Port Number Required in HTTP "Host" Header Parameter?HTTP“主机”标头参数中是否需要端口号?
【发布时间】:2011-03-22 19:19:02
【问题描述】:

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

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

那么 http 服务器是否应该识别出我正在尝试在端口 6103 上与其通信?或者由于它在请求标头中被省略了,我是否在赌服务器是否真的识别到这一点?

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

【问题讨论】:

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

标签: http http-headers


【解决方案1】:

请参阅section 14.23 of the HTTP spec,它指定如果端口号不是默认端口(HTTP 为 80,HTTPS 为 443),则应包含端口号。

【讨论】:

  • 是的,我也在 RFC 中读到过。我可能应该注意到这一点。我希望有人能说出一些知识渊博,具体了解某些 Web 服务器和 Web 应用程序框架如何对此类请求做出反应,例如:“一些 Web 服务器/应用程序框架处理它,但 X 和 Y 没有”等等等。最终我希望只接受 RFC 所说的话,但我可能会在我放弃的前一天提出这个问题。
  • 谢谢,现在我知道这是bug in IE11 mobile
  • 应该澄清的是,RFC 说如果它不是默认端口用于协议。并举例说明,如果 HTTP 应该是 80。如果是 HTTPS,则默认为 443(即在 https 请求中,可能不包括 443 端口。)
【解决方案2】:

为现代浏览器更新:

浏览器(和 curl)仅在端口不是标准端口时才会添加端口,这符合 HTTP spec 的要求并在 @superfell 的 answer 中注明。

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

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

为了回答您的comment,服务器将做任何他们需要做的事情以符合规范,并且规范仅在需要的情况下提出建议。正因为如此,我觉得这并不是服务器如何处理它的问题 - 更多的是客户端如何发出请求:在 Host Header 中是否包含端口号。

【讨论】:

  • 规范中明确表示可以包含端口号(命名权限包括端口),即端口号是必填,除非它是服务的默认值.
  • 我想补充一点:我注意到某些代理或充当反向代理的 Web 服务器可能会重写此内容。使用 NGINX 前端应用程序服务器的常见配置是设置主机头和 :。在此配置中运行时,最终结果是浏览器所做的事情以及各种 Web 代理、WAF 和 Web 服务器在任何应用程序代码接收标头之前可能对标头执行的操作的组合
  • 我注意到,如果您加载 http://www.facebook.com:80/example 并在主机标头中包含 :80 ,它会将您重定向到 https://www.facebook.com:80/example ,这显然不起作用。如果您的客户不这样做会破坏 Facebook,那么您最好这样做。
【解决方案3】:

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 时,肯定会添加端口号。以下截图来自谷歌浏览器

【讨论】:

    【解决方案4】:

    对希望不存在的服务器“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 ] ;
    

    【讨论】:

      【解决方案5】:

      主机头语法:

      主持人::

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

      主机:example.com:1337

      【讨论】:

        猜你喜欢
        • 2018-10-06
        • 2013-12-21
        • 2021-11-13
        • 2017-08-26
        • 2013-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多