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