开发过程中,经常会遇到URL 301或302重定向的情况,这时候我们可能需要获取重定向之后的 url

1.用 get_headers 函数

get_headers 是 PHP 系统级函数,它返回一个包含有服务器响应一个 HTTP 请求所发送的标头的数组。如果失败则返回 False 并发送一条 E_WARNING 级别的错误信息
可用来远程判断文件是否存在

参考网址
https://www.jb51.net/article/36180.htm
https://www.php.net/manual/zh/function.get-headers.php

函数定义
array get_headers(string $url [, int $format])

参数说明
$url 目标 URL
$format :** 如果将可选的 format 参数设为 1 ,则 get_headers 会解析相应的信息并设定数组的键名。

示例

  1. $url = 'http://www.xxxx.com';
  2. $response = get_headers($url, 1);
  3. var_dump($response);

使用 fsockopen() 内置函数

示例 :

/**
* get_redirect_url() 获取301、302重定向后的URL地址
* @param string $url 请求地址
* $return string  重定向后真实url
*/
function get_redirect_url($url){
    $redirect_url = false;

    // parse_url 函数:解析url,并返回其组成部分
    $url_parts = @parse_url($url);
  if (!$url_parts) return false;
  if (!isset($url_parts['host'])) return false;
  if (!isset($url_parts['path'])) $url_parts['path'] = ‘/’;

  $sock = fsockopen($url_parts['host'], (isset($url_parts['port']) ? (int)$url_parts['port'] : 80), $errno, $errstr, 30);
  if (!$sock) return false;

  $request = “HEAD ” . $url_parts['path'] . (isset($url_parts['query']) ? ‘?’.$url_parts['query'] : ”) . ” HTTP/1.1\r\n”;
  $request .= ‘Host: ‘ . $url_parts['host'] . “\r\n”;
  $request .= “Connection: Close\r\n\r\n”;
  fwrite($sock, $request);
  $response = ”;
  while(!feof($sock)) $response .= fread($sock, 8192);
  fclose($sock);

  if (preg_match(‘/^Location: (.+?)$/m’, $response, $matches)){
      return trim($matches[1]);
  } else {
      return false;
  }
}

使用 cURL 函数

/**
* get_redirect_url() 获取301、302重定向后的URL地址
* @param string $url 请求地址
* $return string  重定向后真实url
*/
function get_redirect_url($url, $referer=”, $timeout = 10) {
  $redirect_url = false;
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_HEADER, TRUE);
  curl_setopt($ch, CURLOPT_NOBODY, TRUE);//不返回请求体内容
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);//允许请求的链接跳转
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
  curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    ‘Accept: */*’,
    ‘User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)’,
    ‘Connection: Keep-Alive’)
    );
  if ($referer) {
      curl_setopt($ch, CURLOPT_REFERER, $referer);//设置referer
  }

    $content = curl_exec($ch);
  if(!curl_errno($ch)) {
    $redirect_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);//获取最终请求的url地址
  }

    return $redirect_url;
}