使用PHP模拟 URL Rewrite

项目中有许多的服务器不支持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

你可能感兴趣的:(PHP,String,function,server,url,query)