/** * 该方法用于获取项目的base url, 由于项目没有使用单一入口的框架, 而又不想使用绝对路径, * 绝对路径不方便开发, 也不方便读者下载项目代码后自行阅读 * NOTICE: 该方法所在文件必须放在这个目录, 由于采用文件相对位置的方式来确定路径 * * 该方法利用backtrace()方法获取到正在被处理脚本的路径(物理路径), 然后获取config.php文件的路径, * 进行对比,就可以得出正在被请求的文件和根目录的"距离", 以此来生成项目base url. * * @param string $url 相对项目web根目录的路径 * @param boolean $absolute 是否生产绝对地址 * @sample: * url_for("/") 这返回项目的主目录一般为根域名, 而在开发时可能不是, * 例如链接到书籍首页的地址为: url_for("/book/?p=index") */ function url_for($url, $absolute = false) { if (is_external_url($url)) { return $url; } static $base_url = null; if ($base_url === null) { $backtrace = debug_backtrace(); $base_path = dirname(dirname(__FILE__)); // 这个路径是项目的物理路径, $document_root = realpath($_SERVER['DOCUMENT_ROOT']); // 这个路径可能是软链接 // 比如phpcloud的document_root和预期的有包含关系不存在,如果这样则把项目目录修改为文档根目录 if (strpos($base_path, $document_root) !== 0) { $document_root = $base_path; } $script_root = realpath(dirname($_SERVER['SCRIPT_FILENAME'])); // 获取最后的一个调用, 也就是被请求的脚本路径 $request_script = realpath(dirname($backtrace[count($backtrace) - 1]['file'])); $base_url = substr($script_root, strlen($document_root), strlen($script_root) - strlen($document_root)); $offset = strlen($request_script) - strlen($base_path); if ($offset) { $base_url = substr($base_url, 0, -$offset); } } $protocal = isset($_SERVER['HTTP_PORT']) && $_SERVER['HTTP_PORT'] == '443' ? 'https' : 'http'; $port = isset($_SERVER['HTTP_PORT']) && $_SERVER['HTTP_PORT'] ? $_SERVER['HTTP_PORT'] : ""; $port_str = $port ? $port == '80' || $port == '443' ? "" : ":" . $port : ""; // !isset的情况下就是在命令行模式下的,这时使用默认的线上host信息 $host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ONLINE_HOSTNAME; return ($absolute ? "{$protocal}://{$host}{$port_str}" : "") . $base_url . $url; }
/** * 该方法用于获取项目的base url, 由于项目没有使用单一入口的框架, 而又不想使用绝对路径, * 绝对路径不方便开发, 也不方便读者下载项目代码后自行阅读 * NOTICE: 该方法必须放在这个目录, 由于采用文件相对位置的方式来确定路径 * * 该方法利用backtrace()方法获取到正在被处理脚本的路径(物理路径), 然后获取config.php文件的路径, * 进行对比,就可以得出正在被请求的文件和根目录的"距离", 以此来生成项目base url. * * @param string $url 相对项目web根目录的路径 * @param boolean $absolute 是否生产绝对地址 * @sample: * url_for("/") 这返回项目的主目录一般为根域名, 而在开发时可能不是, * 例如链接到书籍首页的地址为: url_for("/book/?p=index") */ function url_for($url, $absolute=false) { if(is_external_url($url)) return $url; static $base_url = null; if(!$base_url) { $backtrace = debug_backtrace(); $base_path = dirname(dirname(__FILE__)); // 这个路径是物理路径, 由于使用 $document_root = $_SERVER['DOCUMENT_ROOT']; // 这个路径可能是软链接 $script_root = dirname($_SERVER['SCRIPT_FILENAME']); // 获取最后的一个调用, 也就是被请求的脚本路径 $request_script = dirname($backtrace[count($backtrace) - 1]['file']); $base_url = substr($script_root, strlen($document_root), strlen($script_root) - strlen($document_root)); $offset = strlen($request_script) - strlen($base_path); if($offset) { $base_url = substr($base_url, 0, -$offset); } } $protocal = (isset($_SERVER['HTTP_PORT']) && $_SERVER['HTTP_PORT'] == '443') ? 'https' : 'http'; $host = $_SERVER['HTTP_HOST']; return ($absolute ? "{$protocal}://{$host}" : "" ) . $base_url . $url; }
function stylesheet_include_tag($style_names) { if (is_array($style_names)) { $tags = ''; foreach ($style_names as $style) { $tags .= stylesheet_include_tag($style) . "\n"; } return $tags; } $url = is_external_url($style_names) ? $style_names : url_for("/css/{$style_names}?v=" . TIPI::getVersion()); return '<link href="' . $url . '" media="screen" rel="stylesheet" type="text/css" />'; }
function is_external_url($url, $check_fragments = false) { $url = strtolower($url); $url = str_replace('https:', 'http:', $url); // If the URL has http:// or https://, check if it is pointing to this website if (stristr($url, 'http://')) { $blog_url = strtolower(home_url()); $blog_url = str_replace('https:', 'http:', $blog_url); $blog_url = untrailingslashit($blog_url); // If this site url is not in the target url, it's external. if (!strstr($url, $blog_url)) { return true; } } else { // Check a partial URL (not an absolute url), such as "google.com" or "/about-us/" if (!$check_fragments) { return false; } // Two slashes indicate SSL-agnostic HTTP. AKA, it means HTTPS:// or HTTP://. We'll run it through as HTTP:// instead. if (substr($url, 0, 2) != '//') { return is_external_url('http:' . $url); } // If the URL starts with a single slash, it is relative if (substr($url, 0, 1) != '/') { return false; } // At this point, the url does NOT start with a slash, NOR http://. Run it through with http:// appended, so we can check if it is self-hosted. return 'http://' . $url; } return false; }