项目中有许多的服务器不支持Rewrite,或者配置起来太麻烦,看到许多网站也采用了下面方式的Rewrite方法,于是想到可以用PHP模拟一个这样URL。
?a/haha/b/hehe/d/hoho.html
通过实例化类后,也可以通过$_GET及$_SERVER["QUERY_STRING"]正常获取到页面GET参数的传递,并附加了$_SERVER["R_QUERY_STRING"]预定义变量。这样许多的项目就可以通过不用太大的改变就可以实现Rewrite了。
这个类同时支持以下几种模拟的URL,同时支持原始形态的URL地址,并自动删除值为空的参数和值:
?a/haha/b/hehe/d/hoho.html
?a/haha/b/hehe/d/hoho/
?a/haha/b/hehe/d/hoho
代码刚写完,来不及做更多测试,希望大家多多指出代码中的错误和问题。
下面是这个类的代码 (url_rewrite.class.php):
<?
class URLRewrite {
var $_query_string;
/**
* 构造函数
*
*/
function URLRewrite() {
$this->_query_string = str_replace('.html', '', $_SERVER["QUERY_STRING"]);
}
/**
* 返回模拟 Rewirte 形态页面传递字符串
*
*/
function GetRewriteString() {
if (!strpos($this->_query_string, '&')) return $this->_query_string;
$URLArray = explode('&', $this->_query_string);
for ($i=0; $i<count($URLArray); $i++) {
if (strpos($URLArray[$i], '=')+1 != strlen($URLArray[$i]))
$ParaArray[] = str_replace('=', '/', $URLArray[$i]);
}
return implode('/', $ParaArray);
}
/**
* 返回模拟 Rewirte 形态的 URL 地址
*
*/
function GetRewriteUrl() {
return $_SERVER['PHP_SELF'] . '?' . $this->GetRewriteString() . '.html';
}
/**
* 返回原始形态页面传递字符串
*
*/
function GetOriginalString() {
if (!strpos($this->_query_string, '/')) return $this->_query_string;
$URLArray = explode('/', $this->GetRewriteString($this->_query_string));
for ($i=0; $i<count($URLArray); $i=$i+2) {
if ($URLArray[$i] && $URLArray[$i+1])
$ParaArray[] = $URLArray[$i] . '=' . $URLArray[$i+1];
}
return implode('&', $ParaArray);
}
/**
* 返回原始形态的 URL 地址
*
*/
function GetOriginalUrl() {
return $_SERVER['PHP_SELF'] . '?' . $this->GetOriginalString();
}
/**
* 将解析的参数写入到 $_GET 预定义变量
*
*/
function ParseUrl() {
$URLArray = explode('/', $this->GetRewriteString());
$_GET = '';
for ($i=0; $i<count($URLArray); $i=$i+2) {
$_GET[$URLArray[$i]] = $URLArray[$i+1];
}
$_SERVER["QUERY_STRING"] = $this->GetOriginalString();
$_SERVER["R_QUERY_STRING"] = $this->GetRewriteString();
}
}
测试一下使用后的效果:
include_once ('url_rewrite.class.php');
$ReURL = new URLRewrite();
$ReURL->ParseUrl();
echo '$_SERVER["QUERY_STRING"]:' . $_SERVER["QUERY_STRING"] . '<br>';
echo '$_SERVER["R_QUERY_STRING"]:' . $_SERVER["R_QUERY_STRING"] . '<br>';
echo '原始形态的URL地址:' . $ReURL->GetOriginalUrl() . '<br>';
echo '模拟形态的URL地址:' . $ReURL->GetRewriteUrl() . '<br>';
echo '--------------------------------------------------------------------------------';
echo '$_GET[/'a/'] = ' . $_GET['a'] . '<br>';
echo '$_GET[/'b/'] = ' . $_GET['b'] . '<br>';
echo '$_GET[/'c/'] = ' . $_GET['c'] . '<br>';
echo '$_GET[/'d/'] = ' . $_GET['d'] . '<br>';
URL地址为test.php?a=haha&b=hehe&c=&d=hoho时的显示结果:
$_SERVER["QUERY_STRING"]:a=haha&b=hehe&d=hoho
$_SERVER["R_QUERY_STRING"]:a/haha/b/hehe/d/hoho
原始形态的URL地址:test.php?a=haha&b=hehe&d=hoho
模拟形态的URL地址:test.php?a/haha/b/hehe/d/hoho.html
--------------------------------------------------------------------------------
$_GET['a'] = haha
$_GET['b'] = hehe
$_GET['c'] =
$_GET['d'] = hoho
URL地址为test.php?a/haha/b/hehe/d/hoho时的显示结果:
$_SERVER["QUERY_STRING"]:a=haha&b=hehe&d=hoho
$_SERVER["R_QUERY_STRING"]:a/haha/b/hehe/d/hoho
原始形态的URL地址:test.php?a=haha&b=hehe&d=hoho
模拟形态的URL地址:test.php?a/haha/b/hehe/d/hoho.html
--------------------------------------------------------------------------------
$_GET['a'] = haha
$_GET['b'] = hehe
$_GET['c'] =
$_GET['d'] = hoho