解析php 版获取重定向后的地址(代码)

yipeiwu_com5年前PHP代码库
复制代码 代码如下:

//取重定向的地址
 class RedirectUrl{
     //地址
     var $url;
     //初始化地址
     function RedirectUrl($url){
         $this->url = $url;
     }
     /**
      * get_redirect_url()
      * 取重定向的地址
      *
      * @param string $url
      * @return string
      */
     private function get_redirect_url($url){
         $redirect_url = null;

         $url_parts = @parse_url($url);
         if (!$url_parts) return false;
         if (!isset($url_parts['host'])) return false; //can't process relative URLs
         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;
         }
     }

     /**
      * get_all_redirects()
      * 取所有重定向地址
      *
      * @param string $url
      * @return array
      */
     private function get_all_redirects($url){
         $redirects = array();
         while ($newurl = $this->get_redirect_url($url)){
             if (in_array($newurl, $redirects)){
                 break;
             }
             $redirects[] = $newurl;
             $url = $newurl;
         }
         return $redirects;
     }

     /**
      * get_final_url()
      * 取实际地址
      *
      * @param string $url
      * @return string
      */
     function get_final_url(){
         $redirects = $this->get_all_redirects($this->url);

         if (count($redirects)>0){
             return array_pop($redirects);
         } else {
             return $this->url;
         }
     }
 }

 /**
  * get_show_pic
  * 取最终要显示的图片地址
  *
  * @param string $url
  * @return  string
  */
 function get_show_pic($url,$noimg ='noimg.gif',$newimg="/zb_users/upload/202003/mr2n4zrwynz.jpg"){
     $obj = new RedirectUrl($url);

     $realurl = $obj->get_final_url();

     if(strpos($realurl,$noimg)>0){
         return $newimg;
     }
     return $url;
 }
 //参考
 echo "<img src='".get_show_pic("/zb_users/upload/202003/2jxp4engyvi.jpg")."'/>";
 ?>

相关文章

PHP批量上传图片的具体实现方法介绍.

大家可以通过下面这一段代码,来具体了解PHP批量上传图片的具体方式。我们在学习PHP的时候,肯定是要从实际操作中慢慢积累经验,以巩固我们所学到的知识,逐渐的加强我们的编程水平。 R...

php使用scandir()函数扫描指定目录下所有文件示例

本文实例讲述了php使用scandir()函数扫描指定目录下所有文件。分享给大家供大家参考,具体如下: //遍历子文件夹和文件夹的内容 并且计算出文件的多少 //一个demo 引号替...

PHP 应用程序的安全 -- 不能违反的四条安全规则

大家都知道安全性是重要的,但是行业中的趋势是直到最后一刻才添加安全性。既然不可能完全保护 Web 应用程序,那么为什么要费这个劲儿呢,不是吗?不对。只需采用一些简单的...

php批量缩放图片的代码[ini参数控制]

首先使用一个ini文件来设置要缩放的大小,其中为宽或高0的则为图片放大或缩小,都为0则还是原大小,都不为0都拉抻成指定的大小。 注意:ini文件使用php解释时为注释文件,什么也没有输出...

PHP扩展模块memcached长连接使用方法分析

      网上广泛流传着一篇文章,讲述php的两个扩展模块memcache和memcached的区别,其中特意强调了memcached...