0

ログインフォームの背後にあるページのコンテンツを取得する必要がある次の PHP スクリプトがあります。

localhost サーバーでは正常に動作していますが、ホスト (GoFreeServe) では動作しません。空の応答が返ってきます。($postResult は空です)。

脚本:

    $login_url = 'http://senioren.voetbal.nl/clubs_comp/mijn-teams/competitie/173299/OWIOS-9-zaterdag?destination=clubs_comp%2Fmijn-teams%2Fcompetitie%2F173299%2FOWIOS-9-zaterdag';
$data = file_get_contents("http://voetbal.nl/login/menu/data");
        $parts = explode('name=\"form_build_id\" id=\"',$data,2);
$post_data = 'name=****&pass=****&op=Inloggen&form_build_id='.substr($parts[1],0,37).'&form_id=login_block_login_form';
$ch = curl_init();
$agent = $_SERVER["HTTP_USER_AGENT"];
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_REFERER, $login_url);
curl_setopt($ch, CURLOPT_URL, $login_url );
curl_setopt($ch, CURLOPT_POST, 1 );
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');

$postResult = curl_exec($ch);

curl_getinfo ローカルホスト

[url] => http://senioren.voetbal.nl/clubs_comp/mijn-teams/competitie/173299/OWIOS-9-zaterdag
    [content_type] => text/html; charset=utf-8
    [http_code] => 200
    [header_size] => 557
    [request_size] => 503
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 2.668
    [namelookup_time] => 0
    [connect_time] => 0.016
    [pretransfer_time] => 0.016
    [size_upload] => 57
    [size_download] => 173015
    [speed_download] => 64848
    [speed_upload] => 21
    [download_content_length] => 173015
    [upload_content_length] => 57
    [starttransfer_time] => 1.014
    [redirect_time] => 0
    [certinfo] => Array
        (
        )

    [redirect_url] => 

curl_getinfo ホスト

Array
(
    [url] => http://senioren.voetbal.nl/clubs_comp/mijn-teams/competitie/173299/OWIOS-9-zaterdag
    [content_type] => text/html; charset=utf-8
    [http_code] => 302
    [header_size] => 1125
    [request_size] => 361
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 1.001361
    [namelookup_time] => 0.000638
    [connect_time] => 0.094666
    [pretransfer_time] => 0.094712
    [size_upload] => 0
    [size_download] => 0
    [speed_download] => 0
    [speed_upload] => 0
    [download_content_length] => 0
    [upload_content_length] => 0
    [starttransfer_time] => 1.001199
    [redirect_time] => 0
)

ホストは safe_mode ではなく、CURL がインストールされています。また、cookie.txt は 777 に chmod されています。ホストからの PHPInfo は、http://phpinfo.byethost11.com/index.php にあります

Localhost で 200 の http_code を取得し、ホストで 302 の http_code を取得する理由を知っていますか?

ありがとうございました!

編集: エラー報告 (!@!#!$) をオンにした後、ページは次のエラーを返しました:

Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when safe_mode is enabled or an open_basedir is set in /test2.php on line 39
4

3 に答える 3

1

最初にopen_basedirが設定されているかどうかを確認することで解決しました。その場合、スクリプトは最初にcurl_exec()を実行してCookieを設定し、次にそれを再度実行して非表示のページを取得します。opやform_build_idなどのパラメーターはまったく使用されません:P

コード:

if (ini_get('open_basedir') == '') {
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_MAXREDIRS, 10);

    $postResult = curl_exec($ch);
    curl_close($ch);
} else {
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
    curl_exec($ch);
    $postResult = curl_exec($ch);
}
于 2012-10-02T13:54:08.163 に答える
0

form_build_id 次のようなものをCURLOPT_REFERER送信することになっています

 name=user&pass=pass&op=Inloggen&form_build_id=form-fc3c69bda9d4a9a4a53e70f836ece383&form_id=login_block_login_form
于 2012-10-02T11:24:25.610 に答える
0

FOLLOWLOCATION オプションを追加して、取得しているリダイレクトに従うようにしてください。

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
于 2012-10-02T11:14:06.907 に答える