У меня есть следующий скрипт 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 Localhost
[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 Host
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 chmodded до 777. PHPInfo с хоста можно найти здесь: http://phpinfo.byethost11.com/index.php
Вы знаете, почему я получаю http_code 200 на моем Localhost и http_code из 302 на хосте?
Спасибо!
EDIT: после включения отчета об ошибках (! @! #! $) На странице появилась следующая ошибка:
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
Я решил это, сначала проверив, установлен ли open_basedir. Если это так: сценарий сначала выполняет curl_exec (), чтобы установить куки, а затем снова выполняет его, чтобы получить скрытую страницу. Параметры типа 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); }
Попробуйте добавить опцию FOLLOWLOCATION, чтобы она соответствовала получателю:
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
form_build_id
и CURLOPT_REFERER
отсутствует. Вы должны отправить что-то вроде
name=user&pass=pass&op=Inloggen&form_build_id=form-fc3c69bda9d4a9a4a53e70f836ece383&form_id=login_block_login_form