PHP cURL: Get target of redirect, without following it

前端 未结 5 1311
梦毁少年i
梦毁少年i 2021-01-02 10:47

The curl_getinfo function returns a lot of metadata about the result of an HTTP request. However, for some reason it doesn\'t include the bit of information I want at the m

5条回答
  •  南方客
    南方客 (楼主)
    2021-01-02 11:11

    This can be done in 4 easy steps:

    Step 1. Initialise curl

    curl_init($ch); //initialise the curl handle
    //COOKIESESSION is optional, use if you want to keep cookies in memory
    curl_setopt($this->ch, CURLOPT_COOKIESESSION, true);
    

    Step 2. Get the headers for $url

    curl_setopt($ch, CURLOPT_URL, $url); //specify your URL
    curl_setopt($ch, CURLOPT_HEADER, true); //include headers in http data
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); //don't follow redirects
    $http_data = curl_exec($ch); //hit the $url
    $curl_info = curl_getinfo($ch);
    $headers = substr($http_data, 0, $curl_info['header_size']); //split out header
    

    Step 3. Check if you have the correct response code

    if (!($curl_info['http_code']>299 && $curl_info['http_code']<309)) {
      //return, echo, die, whatever you like
      return 'Error - http code'.curl_info['http_code'].' received.';
    }
    

    Step 4. Parse the headers to get the new URL

    preg_match("!\r\n(?:Location|URI): *(.*?) *\r\n!", $headers, $matches);
    $url = $matches[1];
    

    Once you have the new URL you can then repeat steps 2-4 as often as you like.

提交回复
热议问题