2

第一次提问,但很多次你在当天帮助我。很好!我问这个是因为我在这里遇到了我无法解决的问题,而且由于我的 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。

4

0 回答 0