項目中有許多的伺服器不支援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