/**
* ThinkSNS 版本,太过严密和可移植性,很多基本用不到,参考之
*/
echo '
';
echo PHP_SAPI,'
';//先查看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_,'
';
$_root = dirname(_PHP_FILE_);
define('__ROOT__', (($_root=='/' || $_root=='')?'':rtrim($_root,'/')));
echo __ROOT__,'
';
define('SITE_URL','http:'.'//'.strip_tags($_SERVER['HTTP_HOST']).__ROOT__);
echo SITE_URL,'
';
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));