我们有一台运行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文件。或者我们在这里错过了一些完全不同的东西。
答案 0 :(得分:1)
来自rfc 2616:
Host = "Host" ":" host [ ":" port ] ; Section 3.2.2
所以"主持人:www.example.com:80"是完全合法的。但我在HTTP请求的主机字段中从未看到端口80(或HTTPS的443)。显然需要将请求通过代理路由到非标准端口。
这会让我对第三方图书馆的质量产生一些担忧。我解决这个问题的第一个停靠点是与组件的提供者交谈 - 他们之前可能会遇到这个问题。
您没有提到您对库的访问权限 - 您是否检查过这不是可配置的选项?您是否有权访问源代码以及修改源代码的权限? (如果没有,那就意味着它是商业的付费软件 - 这应该给你一些支持的权利。)
我不知道解决方案是什么,但一些明显的尝试将是:
答案 1 :(得分:0)
Apache使用Host字段执行字符串匹配。因此,当附加:80时,字符串匹配将失败,Apache将认为它是一个它不处理的URL并拒绝它。这就是为什么卷曲剥离它。
您可以阅读有关ServerName
字段here的更多信息,这是Apache与Host匹配的设置。
<强>更新强>
所以:80没有效果,字符串匹配仍然有效。
在我的生产服务器上,我没有更改Apache的配置。我写了一些快速的PHP来发送套接字上的GET请求,而Apache仍然正确地响应了:{80}附加到Host:
字段。
我还检查了服务器本身,看到请求附带错误:80附加到它,Apache回答状态为200并显示HTML。
第三方软件的请求还有其他问题。