Apache配置:显式效果:http在http头字段中的80(主机)

时间:2016-11-29 12:04:07

标签: apache http curl http-headers

我们有一台运行Apache的服务器通过一个简单的API提供服务。我们现在偶然发现我们无法使用第三方库访问API的问题,尽管生成的HTTP请求几乎相同。唯一的区别 - 就Wireshark而言 - 是否存在关于端口80的显式信息。例如:

curl -d "..." http://www.example.com/foo/bar/
curl -d "..." http://www.example.com:80/foo/bar/

两个都工作,Wireshark显示Host: www.example.com,即没有端口80.据我所知,cURL以及浏览器或大多数其他客户端删除端口80.到目前为止,一切都很好。

现在,发出请求的第三方库需要设置端口,我们需要将其设置为80.如果库发出请求,Wiresharks现在显示Host: www.example.com:80 - 请注意其他端口信息。此请求失败,并且就Wiresharks中所见,此失败请求仅在主机字段方面有所不同。

这可能是Apache的配置问题吗?我们目前无法直接访问服务器来检查conf文件。或者我们在这里错过了一些完全不同的东西。

2 个答案:

答案 0 :(得分:1)

来自rfc 2616:

 Host = "Host" ":" host [ ":" port ] ; Section 3.2.2

所以"主持人:www.example.com:80"是完全合法的。但我在HTTP请求的主机字段中从未看到端口80(或HTTPS的443)。显然需要将请求通过代理路由到非标准端口。

这会让我对第三方图书馆的质量产生一些担忧。我解决这个问题的第一个停靠点是与组件的提供者交谈 - 他们之前可能会遇到这个问题。

您没有提到您对库的访问权限 - 您是否检查过这不是可配置的选项?您是否有权访问源代码以及修改源代码的权限? (如果没有,那就意味着它是商业的付费软件 - 这应该给你一些支持的权利。)

我不知道解决方案是什么,但一些明显的尝试将是:

  • 在网络服务器的默认虚拟主机上配置URL,而不是为www.example.com
  • 显式配置
  • 或使用mod_headers重写主机字段
  • 或在网络服务器前放置转发代理,例如squid并添加一个url重写器(如果squid没有自动从主机字段中剥离端口)

答案 1 :(得分:0)

Apache使用Host字段执行字符串匹配。因此,当附加:80时,字符串匹配将失败,Apache将认为它是一个它不处理的URL并拒绝它。这就是为什么卷曲剥离它。

您可以阅读有关ServerName字段here的更多信息,这是Apache与Host匹配的设置。

<强>更新

所以:80没有效果,字符串匹配仍然有效。

在我的生产服务器上,我没有更改Apache的配置。我写了一些快速的PHP来发送套接字上的GET请求,而Apache仍然正确地响应了:{80}附加到Host:字段。

我还检查了服务器本身,看到请求附带错误:80附加到它,Apache回答状态为200并显示HTML。

第三方软件的请求还有其他问题。