初めての質問ですが、以前は何度もお世話になりました。よくやった!私はここで苦労していて解決できない問題があり、PHP (および cURL) の知識が非常に乏しいため、迷子になっているため、これを尋ねます。
背景
私は、いくつかの異なるサーバーに接続し、それらに XMLRPC 呼び出しを行う必要がある Javascript アプリを開発しています。アプリはローカルで実行すると完全に動作します (クロスドメイン セキュリティを無効にします) が、オンラインで実行するには、クロスドメイン プロキシを使用する必要があることを知っていたので、数日間検索して調査した後、該当するものは見つかりませんでした。作品を作ることができたので、なんとか自分で作ることができました(血と汗なしではありませんでした). 何を知っていますか?それは(ほぼ)動作します!!!
これは私の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 の値がかなり異なるためです)。いずれにせよ、クッキーを機能させることはできません。ご覧のとおり、私は AJAX 呼び出しの Set-Cookie ブラウザー保護を独自の X-Set-Cookie ヘッダーで囲み、プロキシがそれに応じて使用または変換できるようにしていますが、Cookie の問題はここにあり、できません。アプリの機能に不可欠な Cookie を使用します。