HTTP response code after redirect

后端 未结 3 929
萌比男神i
萌比男神i 2020-11-30 07:19

There is a redirect to server for information and once response comes from server, I want to check HTTP code to throw an exception if there is any code starting with 4XX. Fo

相关标签:
3条回答
  • 2020-11-30 07:32

    Something like:

      $ch = curl_init(); 
      $httpcode = curl_getinfo ($ch, CURLINFO_HTTP_CODE );
    

    You should try the HttpEngine Class. Hope this helps.

    --

    EDIT

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_USERAGENT, $your_agent_variable);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_REFERER, $your_referer);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 5);
    $output = curl_exec($ch);
    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    
    if ($httpcode ...)
    
    0 讨论(0)
  • Your method with get_headers and requesting the first response line will return the status code of the redirect (if any) and more importantly, it will do a GET request which will transfer the whole file.

    You need only a HEAD request and then to parse the headers and return the last status code. Following is a code example that does this, it's using $http_response_header instead of get_headers, but the format of the array is the same:

    $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;
    }
    

    For more information see: HEAD first with PHP Streams, at the end it contains example code how you can do the HEAD request with get_headers as well.

    Related: How can one check to see if a remote file exists using PHP?

    0 讨论(0)
  • 2020-11-30 07:53

    The solution you found looks good. If the server is not able to send you the http headers in time your problem is that the other server is broken or under very heavy load.

    0 讨论(0)
提交回复
热议问题