周梦康 发表于 2014-03-14 4554 次浏览 标签 : 基准URLPHP框架笔记
/**
 * ThinkSNS 版本,太过严密和可移植性,很多基本用不到,参考之
 */
echo '<pre>';

echo PHP_SAPI,'<br>';//先查看web服务器和php之间的接口类型

//print_r($_SERVER);

define('IS_CGI',substr(PHP_SAPI, 0, 3)=='cgi' ? 1 : 0 );

if(IS_CGI) {

	// CGI/FASTCGI模式下,(我没这个环境没有测试)

	$_temp  = explode('.php',$_SERVER["PHP_SELF"]);

	define('_PHP_FILE_', rtrim(str_replace($_SERVER["HTTP_HOST"],'',$_temp[0].'.php'),'/'));

}else {

	define('_PHP_FILE_', rtrim($_SERVER["SCRIPT_NAME"],'/'));
}

echo _PHP_FILE_,'<br>';

$_root = dirname(_PHP_FILE_);

define('__ROOT__',  (($_root=='/' || $_root=='')?'':rtrim($_root,'/')));

echo __ROOT__,'<br>';

define('SITE_URL',	'http:'.'//'.strip_tags($_SERVER['HTTP_HOST']).__ROOT__);

echo SITE_URL,'<br>';

ThinkPHP的和ThinkSNS的大同小异,但是要简洁一些,感觉完全够用了

define('IS_CGI',substr(PHP_SAPI, 0,3)=='cgi' ? 1 : 0 );
defined('APP_NAME') or define('APP_NAME', basename(dirname($_SERVER['SCRIPT_FILENAME'])));
if(!defined('_PHP_FILE_')) {
    if(IS_CGI) {
        //CGI/FASTCGI模式下
        $_temp  = explode('.php',$_SERVER['PHP_SELF']);
        define('_PHP_FILE_',    rtrim(str_replace($_SERVER['HTTP_HOST'],'',$_temp[0].'.php'),'/'));
    }else {
        define('_PHP_FILE_',    rtrim($_SERVER['SCRIPT_NAME'],'/'));
    }
}
if(!defined('__ROOT__')) {
    // 网站URL根目录
    if( strtoupper(APP_NAME) == strtoupper(basename(dirname(_PHP_FILE_))) ) {
        $_root = dirname(dirname(_PHP_FILE_));
    }else {
        $_root = dirname(_PHP_FILE_);
    }
    define('__ROOT__',   (($_root=='/' || $_root=='')?'':$_root));
}

ThinkSNS和ThinkPHP他们定义SITE_URL的时候都做了足够的兼容,很多环境我预测不到,我只是写一个满足自己能使用的SITE_URL即可。 我做的实际测试:

//虚拟主机名为test.com
define('SITE_URL', 'http:'.'//'.$_SERVER['HTTP_HOST'].dirname($_SERVER["SCRIPT_NAME"]));
echo SITE_URL;

如果该脚本是项目根目录下的文件,执行该脚本,得到的结果为http://test.com/

如果该脚本在项目根目录下的子目录bbs下面,执行该脚本,得到的结果为http://test.com/bbb,而这种情况非常常见,比如我们要在一个网站的子目录下面安装一个论坛。

我做了如下增强,想必应对一般的小项目,这个配置应该是够用了吧!

$_root = dirname(rtrim($_SERVER["SCRIPT_NAME"],'/'));
define('SITE_URL', 'http:'.'//'.$_SERVER['HTTP_HOST'].(($_root == '/')?'':$_root));

评论列表

回复 亮亮 2016-02-17 17:03:40
tp的那个不错,兼容了服务器是Apache,nginx+fastcgi 的情况,自定义的那种写法。可以判断下是http还是https的