3

PHPのcURLスクリプトでPOSTリクエストを送信する際に問題が発生します。

私は、基本的に、私自身の個人的な使用のために、サーバーを介してWebページを取得し、それをローカルに表示するプロキシを作成しようとしています。

URLは次のようになります:http://fetch.example.com/http://theurl.com/

そのページにフォームを投稿すると、フォームのACTIONに移動します(フェッチURLが前に表示されます)。以下のコードを使用してこのPOSTリクエストを処理させようとしていますが、POSTを実行すると、常に400BadRequestエラーが発生します。

$chpg = curl_init();
curl_setopt($chpg, CURLOPT_URL, $_URL);
curl_setopt($chpg, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($chpg, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($chpg, CURLOPT_COOKIESESSION, true);
curl_setopt($chpg, CURLOPT_COOKIEJAR, "cookies/$_COOKIE_FILE.$_DOMAIN.txt");
curl_setopt($chpg, CURLOPT_COOKIEFILE, "cookies/$_COOKIE_FILE.$_DOMAIN.txt");
if($_POST) {
    $fields = array();
    foreach($_POST as $col => $val) {
        $fields[$col] = urlencode($val);
    }
    print_r($fields);
    curl_setopt($chpg, CURLOPT_POST, count($fields));
    curl_setopt($chpg, CURLOPT_POSTDATA, $fields);
}
4

2 に答える 2

3

そこにはいくつかの問題があります。

  1. CURLOPT_POSTDATAである必要がありますCURLOPT_POSTFIELDS

  2. $fields PHP配列をとして 送信していCURLOPT_POSTFIELDSます。これは実際にはの形式の文字列である必要がありますname1=value1&name2=value2&...

    これらの問題を修正するには、PHPコードを次のように変更します。

    if($_POST) {
        $fields_str = http_build_query($_POST);
    
        curl_setopt($chpg, CURLOPT_POST, count($_POST));
        curl_setopt($chpg, CURLOPT_POSTFIELDS, $fields_str);
    }
    

    ローレンス・チェローネが指摘したように、ループforeachを捨ててhttp_build_query代わりに使用することができます。

于 2012-04-29T02:43:22.530 に答える
2

http_build_query&fixedを使用してこれを試してくださいCURLOPT_POSTFIELDS

$chpg = curl_init();
curl_setopt($chpg, CURLOPT_URL, $_URL);
curl_setopt($chpg, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($chpg, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($chpg, CURLOPT_COOKIESESSION, true);
curl_setopt($chpg, CURLOPT_COOKIEJAR, "cookies/$_COOKIE_FILE.$_DOMAIN.txt");
curl_setopt($chpg, CURLOPT_COOKIEFILE, "cookies/$_COOKIE_FILE.$_DOMAIN.txt");
if($_POST) {
    curl_setopt($chpg, CURLOPT_POST, count($_POST));
    curl_setopt($chpg, CURLOPT_POSTFIELDS, http_build_query($_POST));
}
于 2012-04-29T03:08:40.633 に答える