使用cURL在php跨域代理上的Cookie功能?

时间:2012-02-08 11:20:16

标签: php proxy xml-rpc libcurl cross-domain-proxy

第一次问问,但很多时候你帮我回来了。很好!我问这个是因为我在这里挣扎并且问题我无法解决,因为我的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。

0 个答案:

没有答案