Функциональность cookie на междоменном прокси php с использованием cURL? - PullRequest
2 голосов
/ 08 февраля 2012

впервые спрашиваю, но много раз вы помогали мне вернуться в тот день.Прекрасная работа!Я спрашиваю об этом, потому что я борюсь здесь с проблемой, которую не могу решить, и так как мои знания 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 работать.Как видите, я окружаю защиту браузера Set-Cookie на вызовах AJAX своим собственным заголовком X-Set-Cookie, чтобы прокси-сервер мог использовать или переводить соответствующим образом, но проблема с файлами cookie здесь, и я не могуиспользовать куки, которые важны для функциональности приложения.

...