这是一个棘手的问题,因为这个问题并没有真正清楚地描绘出实际涉及哪些系统以及在何处以及使用哪种 IP 白名单。
使用 SOAP 时,有关服务的主要信息源包含在 WSDL 资源中。它应该是通过HTTP请求获得的,如果主资源的XML有xi:include
元素,它可能会触发额外的HTTP请求。所有这些请求都源自充当 SOAP 客户端的系统。您不能在此处选择要使用的 IP 地址(除非您有一个非常奇特的设置,即有两个接口都有到目标系统的有效路由,并且选择正确的 IP 是应用程序的任务 - 我不认为这个这里就是这种情况,我不再考虑它了——你需要为此配置一个流上下文,设置“bindto”选项,并将其传递给 SoapClient)。
在 WSDL 中,包含了真正的 SOAP 服务器的 URL。请注意,服务器本身可能位于与 WSDL 描述完全不同的域中,尽管这样的设置也不常见。您可以通过将选项数组传递给SoapClient
带有条目的条目来覆盖该位置"location" => "http://different.domain.example/path/to/service"
。这不会改变 WSDL 资源的加载,但是对 SOAP 服务的所有请求都会转到那个不同的基本 URL。
该调用从表单收集信息,使用 AJAX 发布到 PHP 函数,该函数将字段格式化为 API 友好格式,然后通过 PHP SoapClient 发送。
这里提到了很多客户端和服务器。提到了 AJAX,这让我相信涉及到浏览器。这是系统 1,充当客户端。一个请求被发送到一些 PHP。这个目标是系统 2,在这里充当服务器。它对其进行转换,并充当客户端,将 SOAP 请求发送到充当另一台服务器的系统 3。
那么白名单在哪里呢?如果它在系统 3 上,它必须列出系统 2 使用的 IP。请注意,每台联网计算机都有多个 IP 地址:至少来自该网络设备的 IP 地址加上 127.0.0.1。使用 IPv6,每台设备甚至有多个地址。在这里使用$_SERVER['SERVER_ADDR']
并没有真正的意义 - 此外,传输方式的系统,如透明代理,也可能影响 IP。您不应使用 SERVER_ADDR 作为白名单的条目。您应该真正检查 shell 上的网络设置,以了解使用了哪个网络设备,以及它具有什么 IP。或者询问您要联系的服务器以检查他们看到的 IP。
我还记录了每个请求,包括$_SERVER['SERVER_ADDR']
和$_SERVER['REMOTE_ADDR']
,它们都按预期报告 IP 地址;他们的技术支持告诉我他们正在接收来自“REMOTE_ADDR”值的请求。
这是奇怪的事情。系统 2 上的 SERVER_ADDR 和 REMOTE_ADDR 已按预期设置。我将其读为 REMOTE_ADDR 是系统 1 的 IP,而 SERVER_ADDR 是系统 2 的 IP。但是系统 3 看到系统 1 的 IP?这里发生了什么?我真的很想从原始海报中获得更多反馈,但这个问题已经有半年了。
并且它没有对所经历的“IP地址问题”进行适当的描述。他们是怎么看的?是“连接失败”的超时,还是任何适当的 HTTP 拒绝以及触发 SoapFault 的某些 4xx 状态代码?只有描述得更好,才能真正解决这个问题。
然而,我确实怀疑可能涉及复杂的代码,而真正的 SOAP 请求实际上是由浏览器/系统 1 发送的,因为系统 2 上生成的 XML 被镜像回系统 1,然后发送到系统 3。它至少可以解释为什么在系统 3 上可以看到系统 1 的 IP。