如果你对该文章中的内容有疑问/不解,可以点击此处链接提问
要注明问题和此文章链接地址 点击此处跳转
<?php /* * 请勿使用windows下的记事本修改本文件。推荐使用 notepad++ * 版本v2.5 * 1.500页面优化 * 2.数据请求增加重试,减少请求失败 * 版本v2.4 * 新增加cdn节点检测 * 版本 v2.3 * 1.500页面展示 * 版本 v2.2 * 1.增加mbstring检测 * 2.错误显示 *版本 v2.1 * 1.增加cache检测 * 2.增加显示debug信息限制 * * 版本 v2.0 * 1.documentUrl 做兼容解决部分用户二级目录报错 * 2.增加debug信息方便为用户定位错误 * * 版本 v1.1.0 * 升级日志: * 1、添加自动更新 * 2、修正缓存的BUG * 3、添加自动清理cache * 4、实现http code的转发 * * 版本 v1.0.1 * 升级日志: * 1、修正第一次无法打开,需要刷新才能打开的BUG * 2、添加对二级目录的支持 * 3、添加对非index.php文件名的支持。 * * */ $appId = '******'; // 站点的APPID (请勿修改和泄漏) $appKey = '*********';// 站点的APP KEY(请勿修改和泄漏) $proxyVersion = 10; //代理版本 $autoCleanCache = 100; //自动清除缓存数量限制 //=============================================================================== //=============================================================================== //=============================================================================== //================ 请勿修改以下程序 ==================== //=============================================================================== //=============================================================================== //=============================================================================== $host = "http://cms4.dataoke.com"; //域名 @date_default_timezone_set('Asia/Shanghai'); //设置时区 /* 获取用户浏览器操作系统信息 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 */ $test_env = strrpos(@$_SERVER['HTTP_USER_AGENT'], 'test') === false ? false : true; /* 获取传参方式,并转换成大写 $_SERVER["REQUEST_METHOD"] get */ $requestMethod = strtoupper(@$_SERVER["REQUEST_METHOD"]); /* 取得当前路径 $_SERVER["REQUEST_URI"] */ $requestUrl = @$_SERVER["REQUEST_URI"]; if ($test_env) { ini_set("display_errors", "On"); error_reporting(E_ALL | E_STRICT); }else{ /* 使用ini_set 修改php.ini的值 ini_set("选项","值"); ini_set("display_errors", "Off");//关闭错误提示 */ @ini_set("display_errors", "Off"); } // 获取时间 $css_static = @date('Y-m-d'); $html_500=<<<html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="x-dns-prefetch-control" content="on"/> <meta name="apple-mobile-web-app-capable" content="yes"/> <meta content="telephone=no" name="format-detection"/> <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no"/> <link href="https://cmsstatic.dataoke.com/error/error.css?v={$css_static}" rel="stylesheet"> </head> <body> <div class="error_main"> <p class="img"></p> <p class="text">咦?出错啦,请稍后再试~ </p> <p class="botton"> <a onclick="window.location.reload();" href="javascript:;" class="botton_par">点击刷新</a> </p> </div> </body> <script src="https://cmsstatic.dataoke.com/error/error.js?v={$css_static}"></script> </html> html; /* 判断是否已经初始化 */ if ($test_env && isset($_GET['debug']) && $_GET['debug'] == 'php') { header("Content-type: text/html; charset=utf-8"); echo 'cms 版本:' . $proxyVersion . '<br>'; echo 'php 版本:' . PHP_VERSION . '<br>'; /* 判断是否已经开启 function_exists 给定的函数已经被定义就返回 TRUE */ if (function_exists('curl_init')) { echo 'curl 已经开启 ' . '<br>'; } else { echo 'curl <span style="color: red">未开启,请先开启curl扩展,否则无法运行,请联系您的空间或者服务器提供商</span>' . '<br>'; } if (function_exists('mb_substr')) { echo 'mbstring 已经开启 ' . '<br>'; } else { echo 'mbstring <span style="color: red">未开启,请先开启mbstring扩展,否则无法运行</span>' . '<br>'; } $test_dir = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'cache';//文件存放路径 $test_file = $test_dir . '/test.txt';//文件路径+文件名 /* 判断是否存在,不存在则创建 */ if (!is_dir($test_dir)) { @mkdir($this->dir); } @file_put_contents($test_file, 'test'); if (file_exists($test_file)) { echo 'cache:有效<br>'; } else { echo 'cache <span style="color: red">无效</span>' . '<br>'; } if(function_exists('gethostbyname')){ echo $host.' --CDN 节点 ---'.gethostbyname(str_replace('http://','',$host)).'<br/>'; echo 'www.dataoke.com --CDN 节点 ---'.gethostbyname("www.dataoke.com"); } exit; } $cache = new CacheHelper(); /* 判断是否含有参数clean,,如果有清除缓存 */ if (isset($_REQUEST['clean'])) { $cache->clean(); header("Content-type: text/html; charset=utf-8"); echo '已清除缓存'; exit; } /* 设置随机数,随机清楚缓存 */ if (mt_rand(0, $autoCleanCache) == 1) { $cache->clean(); } /* 生成key值 */ $key = md5($requestUrl . CacheHelper::isMobile() . CacheHelper::isIPad() . CacheHelper::isIPhone() . CacheHelper::isMicroMessenger().CacheHelper::isWeibo()); if ($requestMethod == 'GET') { /* 判断如果不存在用户浏览器操作系统信息 */ if (!$test_env) { $cacheData = $cache->Get($key); if ($cacheData !== false && !empty($cacheData)) { @header('Dtk-Cache-Check:2'); echo $cacheData; exit; } } } /* $_SERVER["PHP_SELF"] 当前执行脚本的文件名,与 document root 有关 /quan/index.php $_SERVER["PHP_SELF"] $_SERVER["SCRIPT_NAME"] $_SERVER["DOCUMENT_URI"] 三区别 */ $documentUrl = @$_SERVER["PHP_SELF"]; if (empty($documentUrl)) { $documentUrl = @$_SERVER["SCRIPT_NAME"]; } if (empty($documentUrl)) { $documentUrl = @$_SERVER["DOCUMENT_URI"]; } if (empty($documentUrl)) { $documentUrl = $requestUrl; $str_pos = strpos($requestUrl, '?'); if ($str_pos !== false) { $documentUrl = substr($requestUrl, 0, $str_pos); } } /* 页面加载 */ //实例化 $httpHelper = new HttpHelper($appId, $appKey, $proxyVersion, $documentUrl); //获取页面 $html = $httpHelper->getHtml($host, $requestUrl, $requestMethod == 'POST' ? @$_POST : array(), $requestMethod); if ($requestMethod == 'GET' && $httpHelper->httpCode == 200 && !empty($html) && !$test_env) { $cache_check = !empty($_COOKIE['cache_check']) ? $_COOKIE['cache_check'] : null; $expire = empty($cache_check) ? 60 : 600; @header('Dtk-Cache-Check-time:'.$expire); $cache->Set($key, $html, $expire); } if (!empty($html)) { echo $html; }else{ $duration = 3600+time(); @setcookie('cache_check', 1, $duration, '/'); echo $html_500;//如果为空输出500错误 } exit; class HttpHelper { protected $appId; protected $key; protected $documentUrl; protected $proxyVersion; protected $upgradeUrl = "http://www.dataoke.com/pmc/upgrade.html"; public $httpCode = 200; public function __construct($appId, $key, $proxyVersion, $documentUrl) { $this->appId = $appId; $this->key = $key; $this->documentUrl = $documentUrl; $this->proxyVersion = $proxyVersion; } /** * @param $url * @param $requestUrl * @param array $param * @param string $method * @param bool $isAjax * @param string $cookie * @param string $refer * @param null $userAgent * @param bool $checkNewVersion * @return string * 获得HTML页面 */ public function getHtml($url, $requestUrl, $param = array(), $method = 'GET', $isAjax = null, $cookie = NULL, $refer = null, $userAgent = null, $checkNewVersion = true,$re_try = true) { $begin_time = @microtime(true); if (strpos($requestUrl, 'auth') !== false) { $url .= '/auth'; } if($requestUrl=='/favicon.ico'){ exit; } $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER, 1); empty($refer) && $refer = @$_SERVER['HTTP_REFERER']; $ua = $userAgent; empty($ua) && $ua = @$_SERVER['HTTP_USER_AGENT']; $curl_time = $re_try == true ? 5 : 40; curl_setopt($ch, CURLOPT_TIMEOUT, $curl_time); curl_setopt($ch, CURLOPT_USERAGENT, $ua); curl_setopt($ch, CURLOPT_REFERER, $refer); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $header = array( 'APPID: ' . $this->appId, 'APPKEY: ' . $this->key, 'PROXY-VERSION: ' . $this->proxyVersion, 'CMS-HOST: ' . @$_SERVER["HTTP_HOST"], 'DOCUMENT-URL: ' . $this->documentUrl, 'REQUEST-URL: ' . $requestUrl, ); //debug global $test_env; if ($test_env && isset($_GET['debug']) && $_GET['debug'] == 'header') { echo 'CMS-HOST: ' . @$_SERVER["HTTP_HOST"] . '<br>'; echo 'DOCUMENT-URL: ' . $this->documentUrl . '<br>'; echo 'REQUEST-URL: ' . $requestUrl . '<br>'; echo 'api-host: ' . $url . '<br>'; exit; } $_isAjax = false; if ($isAjax) { $_isAjax = true; } if (!$_isAjax && $isAjax === null) { $_isAjax = $this->getIsAjaxRequest(); } if ($_isAjax) { $header[] = 'X-Requested-With: XMLHttpRequest'; } $clientIp = $this->get_real_ip(); if (!empty($clientIp)) { $header[] = 'CLIENT-IP: ' . $clientIp; $header[] = 'X-FORWARDED-FOR: ' . $clientIp; } curl_setopt($ch, CURLOPT_HTTPHEADER, $header); if (empty($cookie)) { $cookie = $_COOKIE; } if (is_array($cookie)) { $str = ''; foreach ($cookie as $k => $v) { $str .= $k . '=' . $v . '; '; } $cookie = $str; } if (!empty($cookie)) { curl_setopt($ch, CURLOPT_COOKIE, $cookie); } if (strtolower($method) == 'post') { curl_setopt($ch, CURLOPT_POST, TRUE); if ($param) { curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($param)); } curl_setopt($ch, CURLOPT_URL, $url); } else { curl_setopt($ch, CURLOPT_HTTPGET, TRUE); if ($param) { $urlInfo = parse_url($url); $q = array(); if (isset($urlInfo['query']) && !empty($urlInfo['query'])) { parse_str($urlInfo['query'], $q); } $q = array_merge($q, $param); $cUrl = sprintf('%s://%s%s%s%s', $urlInfo['scheme'], $urlInfo['host'], isset($urlInfo['port']) ? ':' . $urlInfo['port'] : '', isset($urlInfo['path']) ? $urlInfo['path'] : '', count($q) ? '?' . http_build_query($q) : ''); curl_setopt($ch, CURLOPT_URL, $cUrl); } else { curl_setopt($ch, CURLOPT_URL, $url); } } try { $r = curl_exec($ch); $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE); $header = mb_substr($r, 0, $headerSize); $r = mb_substr($r, $headerSize); $this->httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); } catch (Exception $e) { return $re_try == true ? $this->getHtml($url, $requestUrl, $param, $method, $isAjax, $cookie, $refer, $userAgent, $checkNewVersion, false) : ''; } unset($ch); $headers = explode("\r\n", $header); //debug if ($test_env && isset($_GET['debug']) && $_GET['debug'] == 'res') { var_dump($r); var_dump($this->httpCode); exit; } //debug if ($test_env && isset($_GET['debug']) && $_GET['debug'] == 'resheader') { var_dump($headers); exit; } if ($this->httpCode != 200) { if (function_exists('http_response_code')) { http_response_code($this->httpCode); } else { if ($this->httpCode !== 302) { $this->setHttpResponseCode($this->httpCode); } } } $expires = time() + 300; foreach ($headers as $h) { $h = trim($h); if (empty($h) || preg_match('/^(HTTP|Connection|EagleId|Server|X\-Powered\-By|Date|Transfer\-Encoding|Content)/i', $h)) { continue; } if (strpos($h, 'expires:') !== false) { $temp_arr = explode(':', $h); if (!empty($temp_arr[1]) && is_numeric(trim($temp_arr[1]))) { $expires = intval(trim($temp_arr[1])); } } if (strpos($h, 'Cookie') !== false) { $h = explode(':', $h); if (!empty($h[1])) { $h = explode('=', $h[1]); if (!empty($h[0]) && !empty($h[1])) { @setcookie(trim($h[0]), trim($h[1]), $expires); } } } else { @header($h); } } //debug if ($test_env && isset($_GET['debug']) && $_GET['debug'] == 'res1') { var_dump($r); var_dump($headers); exit; } if($re_try===false){ $Dtk_Cache_Check = 1; }else{ $Dtk_Cache_Check = 0; } $end_time = @microtime(true); try{ @header('Dtk-Cache-Check-'.$Dtk_Cache_Check.':'.($end_time-$begin_time)); }catch (Exception $e){ } if ($this->httpCode != 0 && $this->httpCode != 500 && $this->httpCode != 200 && $this->httpCode != 302) { return false; } if($this->httpCode==200 && $checkNewVersion){ foreach ($headers as $h) { if ( preg_match('/pv:\s*(?P<pv>\d+)/i', $h, $regs)) { $pv = $regs['pv']; if ($pv > $this->proxyVersion) { $this->upgrade(); } } } } return $re_try == true && empty($r) ? $this->getHtml($url, $requestUrl, $param, $method, $isAjax, $cookie, $refer, $userAgent, $checkNewVersion, false) : $r; } protected function upgrade() { $php = $this->getHtml($this->upgradeUrl, '', array(), 'GET', false, null, null, null, false); if ($php === false || strlen($php) < 500) { return; } $php = @json_decode($php, true); if (empty($php['appid']) || empty($php['appkey']) || empty($php['content']) || $php['appid'] !== $this->appId) { return; } $file = @$_SERVER["DOCUMENT_ROOT"] . $this->documentUrl; if (!defined("DTK_TYPE")) { @file_put_contents($file, $php['content'], LOCK_EX); } else { $file .= 'req.php'; @file_put_contents($file, $php['content'], LOCK_EX); } $cache = new CacheHelper(); $cache->clean(); } function get_real_ip() { if (@$_SERVER["HTTP_X_FORWARDED_FOR"]) { $ip = @$_SERVER["HTTP_X_FORWARDED_FOR"]; } elseif (@$_SERVER["HTTP_CLIENT_IP"]) { $ip = @$_SERVER["HTTP_CLIENT_IP"]; } elseif (@$_SERVER["REMOTE_ADDR"]) { $ip = @$_SERVER["REMOTE_ADDR"]; } elseif (getenv("HTTP_X_FORWARDED_FOR")) { $ip = getenv("HTTP_X_FORWARDED_FOR"); } elseif (getenv("HTTP_CLIENT_IP")) { $ip = getenv("HTTP_CLIENT_IP"); } elseif (getenv("REMOTE_ADDR")) { $ip = getenv("REMOTE_ADDR"); } else { $ip = ""; } return $ip; } public function getIsAjaxRequest() { return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest'; } public function setHttpResponseCode($code) { switch ($code) { case 100: $text = 'Continue'; break; case 101: $text = 'Switching Protocols'; break; case 200: $text = 'OK'; break; case 201: $text = 'Created'; break; case 202: $text = 'Accepted'; break; case 203: $text = 'Non-Authoritative Information'; break; case 204: $text = 'No Content'; break; case 205: $text = 'Reset Content'; break; case 206: $text = 'Partial Content'; break; case 300: $text = 'Multiple Choices'; break; case 301: $text = 'Moved Permanently'; break; case 302: $text = 'Moved Temporarily'; break; case 303: $text = 'See Other'; break; case 304: $text = 'Not Modified'; break; case 305: $text = 'Use Proxy'; break; case 400: $text = 'Bad Request'; break; case 401: $text = 'Unauthorized'; break; case 402: $text = 'Payment Required'; break; case 403: $text = 'Forbidden'; break; case 404: $text = 'Not Found'; break; case 405: $text = 'Method Not Allowed'; break; case 406: $text = 'Not Acceptable'; break; case 407: $text = 'Proxy Authentication Required'; break; case 408: $text = 'Request Time-out'; break; case 409: $text = 'Conflict'; break; case 410: $text = 'Gone'; break; case 411: $text = 'Length Required'; break; case 412: $text = 'Precondition Failed'; break; case 413: $text = 'Request Entity Too Large'; break; case 414: $text = 'Request-URI Too Large'; break; case 415: $text = 'Unsupported Media Type'; break; case 500: $text = 'Internal Server Error'; break; case 501: $text = 'Not Implemented'; break; case 502: $text = 'Bad Gateway'; break; case 503: $text = 'Service Unavailable'; break; case 504: $text = 'Gateway Time-out'; break; case 505: $text = 'HTTP Version not supported'; break; default: $text = ''; break; } $protocol = (isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0'); @header($protocol . ' ' . $code . ' ' . $text); } } /* 清除缓存 */ class CacheHelper { protected $dir = ''; public function __construct() { $this->dir = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'cache'; if (is_dir($this->dir)) { return; } @mkdir($this->dir); } public function Set($key, $value, $expire = 360) { $data = array( 'time' => time(), 'expire' => $expire, 'value' => $value ); @file_put_contents($this->dir . DIRECTORY_SEPARATOR . md5($key) . 'cache', serialize($data)); } public function Get($key) { $file = $this->dir . DIRECTORY_SEPARATOR . md5($key) . 'cache'; if (!file_exists($file)) { return false; } $str = @file_get_contents($file); if (empty($str)) { return false; } $data = @unserialize($str); if (!isset($data['time']) || !isset($data['expire']) || !isset($data['value'])) { return false; } if ($data['time'] + $data['expire'] < time()) { return false; } return $data['value']; } static function isMobile() { $ua = @$_SERVER['HTTP_USER_AGENT']; return preg_match('/(iphone|android|Windows\sPhone)/i', $ua); } public function clean() { if (!empty($this->dir) && is_dir($this->dir)) { @rmdir($this->dir); } $files = @scandir($this->dir); foreach ($files as $file) { @unlink($this->dir . DIRECTORY_SEPARATOR . $file); } } static function isWeibo() { $ua = @$_SERVER['HTTP_USER_AGENT']; return preg_match('/Weibo/i', $ua); } static function isMicroMessenger() { $ua = @$_SERVER['HTTP_USER_AGENT']; return preg_match('/MicroMessenger/i', $ua); } static function isIPhone() { $ua = @$_SERVER['HTTP_USER_AGENT']; return preg_match('/iPhone/i', $ua); } static function isIPad() { $ua = @$_SERVER['HTTP_USER_AGENT']; return preg_match('/(iPad|)/i', $ua); } }