Пример #1
0
/**
 * 该方法用于获取项目的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;
}
Пример #2
0
/**
 * 该方法用于获取项目的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;
}
Пример #3
0
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" />';
}
Пример #4
0
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;
}