使用PHP類比 URL Rewrite

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.