проблема с получением заголовка местоположения из ответа на запрос, сделанный через curl - PullRequest
0 голосов
/ 07 августа 2011

Я зашел на сайт, разместив данные с помощью curl.Теперь я хочу отобразить страницу, которую пользователь обычно видит после входа в систему, но не могу, потому что URL всегда меняется.

http://some.example.com/niceday/foobar.php?TID=abcd, где abcd - какое-то, казалось бы, случайное число.

Я пытался получить заголовки ответа, но он продолжает давать мне заголовки запросаЯ только что отправил.

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://example.com/niceday/dirlogin.php'); //login URL
curl_setopt ($ch, CURLOPT_POST, 1);
$postData = 'userName=scott&password=abc123& etc...';
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
curl_setopt( $ch, CURLOPT_ENCODING, "" );
curl_setopt( $ch, CURLOPT_AUTOREFERER, true );
curl_setopt ($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_NOBODY, true); 
$store = curl_exec($ch);
$info = curl_getinfo($ch);
print_r($info);//wrong headers are printed out

Заголовки для curl_exec ($ ch) показаны, но как мне получить заголовки ответа?Я не уверен, что это уместно, но форма ввода учетных данных использует javascript

Ответы [ 3 ]

2 голосов
/ 07 августа 2011

Вы можете получить строку заголовка ответа так: $headers = curl_getinfo($ch); Но я не вижу, как это поможет вам в вашей проблеме, и тогда вы можете использовать http_parse_header() или explode("\n", $headers);

update:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.mozilla.org/');
curl_setopt ($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_NOBODY, true); // HTTP request is 'HEAD'
$headers=curl_exec($ch);

Это вернет только заголовки.

1 голос
/ 15 августа 2011

Попробуйте это:

<?php

function my_get_headers($url ) {

       $url_info=parse_url($url);
       if (isset($url_info['scheme']) && $url_info['scheme'] == 'https') {
           $port = 443;
           @$fp=fsockopen('ssl://'.$url_info['host'], $port, $errno, $errstr, 10);
       } else {
           $port = isset($url_info['port']) ? $url_info['port'] : 80;
           @$fp=fsockopen($url_info['host'], $port, $errno, $errstr, 10);
       }
       if($fp) {
           stream_set_timeout($fp, 10);
           $head = "HEAD ".@$url_info['path']."?".@$url_info['query'];
           $head .= " HTTP/1.0\r\nHost: ".@$url_info['host']."\r\n\r\n";
           fputs($fp, $head);
           while(!feof($fp)) {
               if($header=trim(fgets($fp, 1024))) {
                        $sc_pos = strpos( $header, ':' );
                        if( $sc_pos === false ) {
                           $headers['status'] = $header;
                        } else {
                            $label = substr( $header, 0, $sc_pos );
                            $value = substr( $header, $sc_pos+1 );
                            $headers[strtolower($label)] = trim($value);
                        }
               }
           }
           return $headers;
       }
       else {
           return false;
       }
   }

   print_r( my_get_headers("http://www.mozilla.org"));  

?>

ВЫХОДЫ:

Array
(
    [status] => HTTP/1.1 200 OK
    [server] => Apache
    [x-backend-server] => pm-web01
    [content-type] => text/html; charset=UTF-8
    [date] => Mon, 15 Aug 2011 14:26:16 GMT
    [keep-alive] => timeout=20, max=999
    [expires] => Mon, 15 Aug 2011 00:36:16 GMT
    [connection] => close
    [x-powered-by] => PHP/5.2.9
    [x-cache-info] => not cacheable; response has already expired
)

Функция my_get_headers была украдена из http://www.php.net/manual/en/function.get-headers.php#64073

0 голосов
/ 07 августа 2011

Документация для get_gheaders гласит: «Извлекает все заголовки, отправленные сервером в ответ на HTTP-запрос».На самом деле должно быть: «Извлекает все заголовки, отправленные сервером в ответ на HTTP-запрос, который вызвал выполнение текущего скрипта».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...