• php版获取重定向后地址的代码分享


    如何获取重定向的地址呢?我们用php实现这样的功能,分享下我的代码,有需要的朋友参考下。

    代码如下:

    <?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
    ";
    $request .= 'Host: ' . $url_parts['host'] . "
    ";
    $request .= "Connection: Close
    
    ";
    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="http://www.jbxue.com/ test.gif"){
    $obj = new RedirectUrl($url);
    
    $realurl = $obj->get_final_url();
    
    if(strpos($realurl,$noimg)>0){
    return $newimg;
    }
    return $url;
    }
    //参考
    echo "<img src='".get_show_pic("http://www.jbxue.com /5.jpg")."'/>";
  • 相关阅读:
    十六、Redis与MySQL数据双写一致性 —— Canal Demo
    十三、redis分布式锁:缓存续命
    十二、redis分布式锁:单机和多机及案例
    十七、缓存双写一致性之更新策略探讨
    十四、Redis的缓存过期淘汰策略
    自定义类型转换器
    [译]. NET 6 新增API 上
    EF 6 新特性三
    EF 6 新特性二
    [译]. NET 6 新增API 下
  • 原文地址:https://www.cnblogs.com/study100/p/3213562.html
Copyright © 2020-2023  润新知