2012-03-02 10 views
4

私はこのようなことを試みましたが、うまくいきませんでした!HEADERSでCurlを使用するには?

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "http://google.com/"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('GET /search?q=kk HTTP/1.1 
Host: www.google.de 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0.2) Gecko/20100101 Firefox/6.0.2 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-gb,en;q=0.5 
Accept-Encoding: gzip, deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Proxy-Connection: Close 
Cookie: PREF=ID=2bb051bfbf00e95b:U=c0bb6046a0ce0334: 
Cache-Control: max-age=0 
Connection: Close 
')); 
$response = curl_exec($ch); 
curl_close($ch); 



    echo $response; 

また、URLを設定せずにヘッダだけでリクエスト全体を行うことはできますか?私はこれがなければ意味ですか?

curl_setopt($ch, CURLOPT_URL, "http://google.com/"); 

ありがとうございます!

+0

暗黙的にsetopt()の配列を設定しようとしていますか?何か違う? – Xailor

+0

なぜ、マニュアルで説明されているようなヘッダーオプションをカンマで区切っていないのですか? – Dan

+0

どのように? @ダン? – Blank

答えて

4

私はそれを動作させました。

1)変更ヘッダHost: www.google.de動機

Host: www.google.comへ: Hostヘッダーで指定されたホストが正確にURLのホストと一致する必要があります。 google.comに作られた検索要求は、検索結果を取得しません。代わりに「google.com」

動機の

2)を使用する「www.google.com」。 www.google.comに行くように指示されます。

3)ホスト名だけでなく、完全なURLをCURLOPT_URLに設定します。例えば。 CURLOPT_URLをcurl_setopt($ch, CURLOPT_URL, "http://www.google.com/search?q=kk");に変更してください。

動機づけ:cURL APIを正しく使用してください。

4)CURLOPT_HTTPHEADERからGET /search?q=kk HTTP/1.1を削除します。置き忘れられています。

動機づけ:cURL APIの正しい使い方。

5)レスポンスはgzipまたはdeflateで圧縮されます。これを中止するには、Accept-Encoding: gzip, deflate要求ヘッダーを削除します。

動機付け:圧縮された応答を受け取ることができるとGoogleに伝えたら、あなたに送るでしょう。 HTTP応答の解凍は、実行したくない追加の手順です。圧縮されていないテキスト形式の場合は、応答を扱うほうが簡単かもしれません。

1

結果のHTTPリクエストに対してこのような高度な制御が必要な場合は、代わりにraw socket functionsを手動で送信することをお勧めします。このマニュアルでは、fsocketsでHTTPリクエストを行う例もあります。

$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30); 
if (!$fp) { 
    echo "$errstr ($errno)<br />\n"; 
} else { 
    $out = "GET/HTTP/1.1\r\n"; 
    $out .= "Host: www.example.com\r\n"; 
    $out .= "Connection: Close\r\n\r\n"; 
    fwrite($fp, $out); 
    while (!feof($fp)) { 
     echo fgets($fp, 128); 
    } 
    fclose($fp); 
} 
+0

Fsockopenが無効です。それで私はcURLを使用しています! – Blank

1

詳細なマニュアルは次回より注意深く読んでください。フィールドを追加する方法の例があります:array('Content-type: text/plain', 'Content-length: 100')、1つの文字列のすべてではなく、フィールドは別の配列要素です。

2

いくつかの問題がありますが、簡単に並べ替えることができます。まず、ヘッダーのホストをURL要求のホストとは異なる設定にしていますが、HTTP1.0を実行しているので、これは必ずしも必要ではありません。

第2に、HTTPHEADERの各行が配列内の独自のものとして必要であり、GET行は含まれません。

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0.2) Gecko/20100101 Firefox/6.0.2', 
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
    'Accept-Language: en-gb,en;q=0.5', 
    'Accept-Encoding: gzip, deflate', 
    'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7', 
    'Proxy-Connection: Close', 
    'Cookie: PREF=ID=2bb051bfbf00e95b:U=c0bb6046a0ce0334:', 
    'Cache-Control: max-age=0', 
    'Connection: Close' 
)); 

(あなたが明確にFirefoxのからこれを盗んだ、とその時古いバージョンが、我々はそれをスライドさせていただきます。)最後に、はい、あなたはそれは、cURLのAPIが設計されただけの方法だ、CURLOPT_URLを指定する必要があります。

4

他のポスターの説明に追加するには、他のcURLオプションで指定されたCURLOPT_HTTPHEADER配列にGETコマンドを貼り付けることもできません。 cURLはcurl_setopt関数を使用して操作することを意味します。ヘッダーセクションにHTTPメッセージを挿入することでそれを回避することはできません。たとえば、コマンドがHTTP GET操作であることを確認するには、CURLOPT_HTTPGETTRUEに設定します(デフォルトでは、cURLはGETを別のものに変更するまで送信します)。

正しいURLにアクセスできない理由について質問するには、ホストだけでなく、パス名全体をCURLOPT_URLに指定する必要があるためです。だから、あなたは本当にcurl_setopt($ch, CURLOPT_URL, "http://google.de/search?q=kk HTTP/1.1");と書いてURLを設定するべきです。

また、GETリクエストの場合、Connection: CloseをHTTPヘッダーに入れる理由がわかりません。そのヘッダーでは、あなたはあなたにあなたが持っている接続を閉鎖しているとGoogleに伝えています。これはcurl_close($ch);によって処理されるため、そのヘッダーについては忘れてください。実際には、HTTPヘッダーの項目の半分はそこに存在しません。たとえば、検索結果を取得するためにリクエストにCookieを送信するのはなぜですか?あなたがそれを送信する前に各ヘッダーが何をするかを知っていることを確認してください。それ以外の場合は、正しいヘッダーを送信しているかどうかを判断する方法はまったくありません。

関連する問題