Php 重定向后的HTTP响应代码

Php 重定向后的HTTP响应代码,php,header,Php,Header,有一个重定向到服务器的信息,一旦响应来自服务器,我想检查HTTP代码以抛出一个异常,如果有任何代码以4XX开头。为此,我需要知道如何从标头中仅获取HTTP代码?这里还涉及到服务器重定向,所以我担心curl对我没有用处 到目前为止,我已经尝试过了,但速度非常慢,在我的例子中会造成脚本超时。我不想为了得到一个HTTP代码而增加脚本超时时间并等待更长的时间 提前感谢您的建议。类似于: $ch = curl_init(); $httpcode = curl_getinfo ($ch, CURL

有一个重定向到服务器的信息,一旦响应来自服务器,我想检查HTTP代码以抛出一个异常,如果有任何代码以4XX开头。为此,我需要知道如何从标头中仅获取HTTP代码?这里还涉及到服务器重定向,所以我担心curl对我没有用处

到目前为止,我已经尝试过了,但速度非常慢,在我的例子中会造成脚本超时。我不想为了得到一个HTTP代码而增加脚本超时时间并等待更长的时间

提前感谢您的建议。

类似于:

  $ch = curl_init(); 
  $httpcode = curl_getinfo ($ch, CURLINFO_HTTP_CODE );
您应该尝试HttpEngine类。 希望这有帮助

--

编辑


你找到的解决方案看起来不错。如果服务器无法及时向您发送http标头,您的问题是另一台服务器已损坏或负载非常重。

使用
获取标头并请求第一个响应行的方法将返回重定向的状态代码(如果有),更重要的是,它将执行GET请求,该请求将传输整个文件

您只需要一个HEAD请求,然后解析header并返回最后一个状态代码。下面是执行此操作的代码示例,它使用
$http\u response\u header
而不是
get\u headers
,但数组的格式相同:

$url = 'http://example.com/';

$options['http'] = array(
    'method' => "HEAD",
    'ignore_errors' => 1,
);

$context = stream_context_create($options);

$body = file_get_contents($url, NULL, $context);

$responses = parse_http_response_header($http_response_header);

$code = $responses[0]['status']['code']; // last status code

echo "Status code (after all redirects): $code<br>\n";

$number = count($responses);

$redirects = $number - 1;

echo "Number of responses: $number ($redirects Redirect(s))<br>\n";

if ($redirects)
{
    $from = $url;

    foreach (array_reverse($responses) as $response)
    {
        if (!isset($response['fields']['LOCATION']))
            break;
        $location = $response['fields']['LOCATION'];
        $code = $response['status']['code'];

        echo " * $from -- $code --> $location<br>\n";
        $from = $location;
    }
    echo "<br>\n";
}

/**
 * parse_http_response_header
 *
 * @param array $headers as in $http_response_header
 * @return array status and headers grouped by response, last first
 */
function parse_http_response_header(array $headers)
{
    $responses = array();
    $buffer = NULL;
    foreach ($headers as $header)
    {
        if ('HTTP/' === substr($header, 0, 5))
        {
            // add buffer on top of all responses
            if ($buffer) array_unshift($responses, $buffer);
            $buffer = array();

            list($version, $code, $phrase) = explode(' ', $header, 3) + array('', FALSE, '');

            $buffer['status'] = array(
                'line' => $header,
                'version' => $version,
                'code' => (int) $code,
                'phrase' => $phrase
            );
            $fields = &$buffer['fields'];
            $fields = array();
            continue;
        }
        list($name, $value) = explode(': ', $header, 2) + array('', '');
        // header-names are case insensitive
        $name = strtoupper($name);
        // values of multiple fields with the same name are normalized into
        // a comma separated list (HTTP/1.0+1.1)
        if (isset($fields[$name]))
        {
            $value = $fields[$name].','.$value;
        }
        $fields[$name] = $value;
    }
    unset($fields); // remove reference
    array_unshift($responses, $buffer);

    return $responses;
}
$url='1!'http://example.com/';
$options['http']=数组(
'方法'=>“头”,
“忽略错误”=>1,
);
$context=stream\u context\u create($options);
$body=file\u get\u contents($url,NULL,$context);
$responses=parse_http_response_头($http_response_头);
$code=$responses[0]['status']['code'];//最后状态代码
echo“状态代码(在所有重定向之后):$code
\n”; $number=计数($responses); $redirects=$number-1; echo“响应数:$Number($redirects Redirect))
\n; 如果($redirects) { $from=$url; foreach(数组_反向($responses)作为$response) { 如果(!isset($response['fields']['LOCATION'])) 打破 $location=$response['fields']['location']; $code=$response['status']['code']; 回显“*$from--$code-->$location
\n”; $from=$location; } 回声“
\n”; } /** *解析\u http\u响应\u头 * *@param数组$headers与$http_response_header相同 *@return数组状态和按响应分组的头,最后一个优先 */ 函数parse_http_response_头(数组$headers) { $responses=array(); $buffer=NULL; foreach($headers作为$header) { if('HTTP/'==substr($header,0,5)) { //在所有响应之上添加缓冲区 if($buffer)数组\u unshift($responses,$buffer); $buffer=array(); 列表($version,$code,$phrase)=分解(“”,$header,3)+数组(“”,FALSE,”); $buffer['status']=数组( “行”=>$header, “版本”=>$version, 'code'=>(int)$code, “短语”=>$phrase ); $fields=&$buffer['fields']; $fields=array(); 继续; } 列表($name,$value)=分解(':',$header,2)+数组('',); //标头名称不区分大小写 $name=strtoupper($name); //具有相同名称的多个字段的值被规范化为 //逗号分隔的列表(HTTP/1.0+1.1) 如果(isset($fields[$name])) { $value=$fields[$name].,'.$value; } $fields[$name]=$value; } 取消设置($fields);//删除引用 数组_unshift($responses,$buffer); 返回$responses; }
有关更多信息,请参见:,最后包含示例代码,说明如何使用
get_headers
执行HEAD请求


相关:

cURL可以很好地跟踪重定向。您可以在文档中阅读它,而不用担心您的假设:,查找
CURLOPT\u FOLLOWLOCATION
我使用CURLOPT\u FOLLOWLOCATION选项尝试了curl。问题是它将一个页面抓取到本地服务器,当我在从服务器获取的页面上输入用户名/密码时,服务器在重定向时会感到困惑。如何解决这个问题?对不起,我不知道HttpEngine类。你能给我一些信息吗?没问题。嗯,我不记得我在哪里上的这门课。。。所以我上传了这个:如果你需要帮助,告诉我!我查看了类文件,但不确定它在这里有什么帮助。它使用curl并使用curl当我将CURLOPT_FOLLOWLOCATION设置为true进行重定向时,GET方法将获取整个页面。设置了超时,但我想在这种情况下这不是问题。相关:在选项$options['http']=array('method'=>“HEAD”,'user_agent'=>“Mozilla/5.0”中添加用户代理(Linux;Android 6.0.1;Nexus 5X Build/MMB29P)AppleWebKit/537.36(KHTML,像Gecko)Chrome/41.0.2272.96 Mobile Safari/537.36“,//必须充当浏览器,或者某些服务器拒绝“忽略错误”=>1,);嗨,哈克雷,你能帮我解决你的相关问题吗?
$url = 'http://example.com/';

$options['http'] = array(
    'method' => "HEAD",
    'ignore_errors' => 1,
);

$context = stream_context_create($options);

$body = file_get_contents($url, NULL, $context);

$responses = parse_http_response_header($http_response_header);

$code = $responses[0]['status']['code']; // last status code

echo "Status code (after all redirects): $code<br>\n";

$number = count($responses);

$redirects = $number - 1;

echo "Number of responses: $number ($redirects Redirect(s))<br>\n";

if ($redirects)
{
    $from = $url;

    foreach (array_reverse($responses) as $response)
    {
        if (!isset($response['fields']['LOCATION']))
            break;
        $location = $response['fields']['LOCATION'];
        $code = $response['status']['code'];

        echo " * $from -- $code --> $location<br>\n";
        $from = $location;
    }
    echo "<br>\n";
}

/**
 * parse_http_response_header
 *
 * @param array $headers as in $http_response_header
 * @return array status and headers grouped by response, last first
 */
function parse_http_response_header(array $headers)
{
    $responses = array();
    $buffer = NULL;
    foreach ($headers as $header)
    {
        if ('HTTP/' === substr($header, 0, 5))
        {
            // add buffer on top of all responses
            if ($buffer) array_unshift($responses, $buffer);
            $buffer = array();

            list($version, $code, $phrase) = explode(' ', $header, 3) + array('', FALSE, '');

            $buffer['status'] = array(
                'line' => $header,
                'version' => $version,
                'code' => (int) $code,
                'phrase' => $phrase
            );
            $fields = &$buffer['fields'];
            $fields = array();
            continue;
        }
        list($name, $value) = explode(': ', $header, 2) + array('', '');
        // header-names are case insensitive
        $name = strtoupper($name);
        // values of multiple fields with the same name are normalized into
        // a comma separated list (HTTP/1.0+1.1)
        if (isset($fields[$name]))
        {
            $value = $fields[$name].','.$value;
        }
        $fields[$name] = $value;
    }
    unset($fields); // remove reference
    array_unshift($responses, $buffer);

    return $responses;
}