2011-08-09 1 views
0

URLを取得パラメータとして取得するスクリプトがあり、そのページの内容をファイルに書き込もうとします。認証されていないページでは正常に動作しますが、認証が必要なページで使用しようとすると破損します。すでにログインしている場合、PHP cURLが認証済みサイトに入ります

私はすでににログインしているので、現在設定されているすべてのクッキーが機能する標準のcURLリクエストを作成すると仮定しましたが、そうではありません。当初、私は302レスポンスを受け取りましたが、 'FOLLOWLOCATION'をtrueに設定すると、私は自分が望むページの代わりにサイトのログインページに行きました。

$client = curl_init(); 

//curl_setopt($client, CURLOPT_HEADER, true); 
curl_setopt($client, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($client, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($client, CURLOPT_URL, $pageToLoad);  

/* Supposedly libcurl loads all cookies auto-magically if you don't set CURL_COOKIESESSION 
if (isset($_SERVER['HTTP_COOKIE'])) { 
    curl_setopt($client, CURLOPT_COOKIE, $_SERVER['HTTP_COOKIE']); 
} 
*/ 

$response = curl_exec($client); 
curl_close($client); 

私はこれが機能するためのCookieJarファイル(私のスクリプトは、devのサーバー上の書き込み権限を持っていないため、「沈没」)を設定する必要があります沈没感を持っていますが、あなたのものです思考?

EDIT: だから、馬鹿の一種であること、とにかく...私はいくつかの書き込みアクセス権を持っているが判明し、私は私のスクリプトを書くことができます確認した私のホームディレクトリに一時フォルダを作っ:

$fname = '/home/temp/cookies.txt'; 
if($save = fopen($fname, 'w')) { 
    fwrite($save, 'testing'); 
} 

スクリプトを実行すると、「テスト」が1行目に表示されます。
私は私のcURLのリクエストに次の2行を追加しました:

curl_setopt($ch, CURLOPT_COOKIEJAR, '/home/temp/cookies.txt'); 
curl_setopt($ch, CURLOPT_COOKIEFILE, '/home/temp/cookies.txt'); 

を、何も私のシナリオでは変わっていません。 cookies.txtファイルはまだ 'testing'と表示されており、クッキーは保存されておらず、最後のアクセス時間も変更されていません。

これ以上の考えはありますか? \

+0

はい、この形式の認証が機能すると思われる場合は、あとからすべてのCookieを使用してリクエストを行う必要があります。 – Brad

+0

あなたはリクエストされたサーバーのソースにアクセスできますか? – bensiu

+0

いいえ、私は要求されたサーバーへのアクセスを持っていません – wolv2012

答えて

0

は、だから私は、私が持っていた生のcURLコードを取り出し、別のプロジェクトからいくつかのZend固有のコードにコピーされ、それがほとんどのために働くように見えました一部(本当にわからない理由...)。私がCoSign(http://cosign.sourceforge.net/)を扱い、プロキシクッキーを使用している唯一の他の問題があります。答える人に感謝します!

1

はい、CURLOPT_COOKIEFILECURLOPT_COOKIEJARの両方のオプションが設定されている必要があります。 'ファイル'バージョンはどこからクッキーを読み込むかです。 jarファイルは、カールオブジェクトが終了したときにクッキーを保存する場所です。それらは同じファイルにすることができます。

実際のファイルを作成するためのサーバーへの書き込み権限がない場合(少なくとも/ tmpまたは同等の書き込みパーマネントを持たない場合は非常に奇妙です)、php://memorywrapper

+0

調味料の部分は私を常に混乱させました。 libcurlが現在のすべてのクッキーを自動的に添付する場合、なぜクッキーが必要ですか? libcurlがcurlセッション中にcookiejarに保存されているクッキーを読み込むようにしますか? – wolv2012

+0

コマンドラインcurlは、あなたのクッキーファイルを標準的な場所(例えば '〜/ .cookies'など)に書き込むことができますが、PHPのカールでは、すべての賭けはオフになっています(Webベースのプロセスは永続的なファイルを書くべきですか?)、毎回手動でCookieファイルの場所を指定する必要があります。 –

1

ここでは、このようなタスクのための私の最愛のパターンです:

$loginUrl = 'http://www.remote_site.de/login.php'; 
$loginFields = array('username' => 'username', 'password' => 'password'); 

getUrl($loginUrl, 'post', $loginFields); 
//now you're logged in and a session cookie was generated 

$remote_page_content = getUrl('http://www.remote_site.de/some_page.php'); 


    function getUrl($url, $method='', $vars='') { 
    $ch = curl_init(); 
    if ($method == 'post') { 
     curl_setopt($ch, CURLOPT_POST, 1); 
     curl_setopt($ch, CURLOPT_POSTFIELDS, $vars); 
    } 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
    curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt'); 
    curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt'); 
    $buffer = curl_exec($ch); 
    curl_close($ch); 
    return $buffer; 
    } 
+0

yep ok。クッキージャーと調味料は私が必要なもののようです。ありがとう! – wolv2012

関連する問題