第一次提问,但很多次你在当天帮助我。很好!我问这个是因为我在这里遇到了我无法解决的问题,而且由于我的 PHP(和 cURL)知识如此匮乏,我迷路了。
的背景
我正在开发一个 Javascript 应用程序,它需要连接到几个不同的服务器并对它们进行 XMLRPC 调用。该应用程序在本地运行良好(禁用跨域安全性),但要使其在线运行我知道我必须使用跨域代理,所以经过几天的搜索和调查,我没有找到一个可以完成这项工作,所以我设法自己制作了一个(并非没有血汗)。知道什么?它(几乎)有效!
这是我的proxy.php:
<?
function readHeader($ch, $header) {
//extracting data to send it to the client
$headers = explode("\n", $header);
foreach ($headers as $item) {
// $string= str_replace($delimiter, $mainDelim, $string);
if (strpos($item, 'Set-Cookie:') !== false) {
$cookie = trim(substr($item,strlen('Set-Cookie:')));
header('X-Set-Cookie:' . $cookie);
} else {
header($item);
}
}
return strlen($header);
}
$allowed_domains = array('domain1.com', 'domain2.com');
header('Content-Type: text/html; charset=iso-8859-1');
$REFERRER = $_SERVER['HTTP_REFERER'];
if ($REFERRER == '') {
// What do you do here?
exit(header('Location: index.html'));
}
$domain = substr($REFERRER, strpos($REFERRER, '://') + 3);
$domain = substr($domain, 0, strpos($domain, '/'));
if (!in_array($domain, $allowed_domains)) {
exit(header('Location: index.html'));
}
$XMLRPC_SERVICE = $_SERVER['HTTP_X_PROXY_URL'];
$xml = $HTTP_RAW_POST_DATA;
$header[] = "Content-type: text/xml; charset=utf-8";
$header[] = "Connection: close";
$header[] = "Accept: text/xml";
if ($_SERVER['HTTP_X_SET_COOKIE'])
$cookie = $_SERVER['HTTP_X_SET_COOKIE'];
if ($_SERVER['HTTP_X_PROXY_URL'] === "other-domain.com")
$header[] = "x-custom-header: value";
$ch = curl_init($XMLRPC_SERVICE);
//URL to post to
curl_setopt($ch, CURLOPT_URL, $XMLRPC_SERVICE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
if ($cookie)
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'readHeader');
$response = curl_exec($ch);
if (curl_errno($ch)) {
echo curl_error($ch);
} else {
curl_close($ch);
echo $response;
}
?>
问题
正如我所说,我让它部分工作。事实上,它适用于大多数常见的 XMLRPC 需求。
它从请求的 HTTP_X_PROXY_URL 标头中获取远程服务器地址,并使用 cURL 进行调用并将值返回给 javascript 客户端而不会出现问题。
当我需要获取/发送会话 cookie 时出现问题(可能是在获取它时,因为当我直接从本地应用程序调用时 cookie 值非常不同)。无论如何,我无法让 cookie 工作。如您所见,我使用自己的 X-Set-Cookie 标头围绕 AJAX 调用的 Set-Cookie 浏览器保护,代理可以使用或相应地进行转换,但是 cookie 的问题就在这里,我不能使用对应用程序功能至关重要的 cookie。