访客点击按钮。你的 PHP 服务器调用外部 API。API 看到的是服务器的出站连接,或者为该连接配置的代理出口。访客的浏览器则在处理到你的网站的另一个连接。

把访客的地址复制进请求头,并不能把 PHP 连接搬到访客的网络上。请求头是通过已建立的连接发送的数据。目标站点可能在自己的应用逻辑中使用可信的转发头,但这不会让请求头的值变成连接的源地址。

代理必须接受连接

要让 PHP cURL 经由另一台机器发出,那台机器必须提供可访问、且获准转发该请求的代理服务。PHP 进程必须能够连接到它。访客的普通浏览器会话不会给你的服务器提供这样的通用代理端点。

libcurl 的代理选项选择 cURL 连接的服务。它无法要求任意一个浏览器代它发起请求。

浏览器发起请求是另一种设计

对某些 API,浏览器可以直接调用目标。这会把请求放到用户自己的网络路径上,并受其本地代理配置影响。这还要求 API 是为浏览器客户端设计的。跨源访问遵循 CORS,而发送到浏览器代码中的凭据会对该客户端可见。

先确定请求应该属于哪一侧,再选择代理方案。把服务器凭据留在服务器上;当服务支持时,使用有文档记录的浏览器集成。两种设计都无法可靠地让服务端请求继承访客的网络身份。

相关文章