使zf在不支持rewrite功能下能正常工作的各種辦法

在實際項目中,應該是把web服務器的rewrite的功能打開,然後就可以使用強大的rewrite功能了。
現在租用的空間中幾乎都會支持rewrite功能,除非它不是做生意的。
那爲什麼還要研究服務器不支持rewrite功能的環境下,還能正常跑zf呢,個人覺得有下面幾個考慮:
1)大部分的php項目,都不是非要rewrite才能運行的,就zf比較特殊,這無形中提高了zf的學習成本。
2)不管什麼原因,確實是有些環境下不支持rewrite功能,例如你的客戶的web服務器是iis,但不支持rewrite功能,但你的項目是用zf開發的,
   那如果能配置成不需要rewrite就能跑,那是多麼幸福的一件事情。
3)在開發階段或演示階段,可以不用考慮web服務器是否支持rewrite功能,少一項設置總比多一項的好。

在回覆“聽說現在zf最新版本可以不用rewrite了”中自己寫了一些答案,但認真的再去分析之後才發現,我們考慮到的問題,zf的開發者早就考慮到並且做了很好的解決方案了。
zf的官方解決方案:
在application.ini加上一行配置
如果地址格式是http://www.myzf.com/index.php,那麼就這樣配置:
resources.frontController.baseurl = "/index.php";

如果地址格式是http://localhost/myzf/index.php,那麼就這樣配置:
resources.frontController.baseurl = "/myzf/index.php";

優點:設置簡單
缺點:開發階段和實際應用的階段,都需要修改該配置

針對上面的缺點和結合我在“聽說現在zf最新版本可以不用rewrite了”寫的解決方案,也提出了自己的另外一個解決辦法。
不需要在application.ini設置resources.frontController.baseurl
在Bootstrap.php 裏面加上下面的代碼
    /***
     * 支持沒有rewrite功能的環境
     */
    protected function _initRewrite() {
        $scriptName = basename($_SERVER['SCRIPT_NAME']);
        if (!isset($_SERVER['REQUEST_URI'])){
            $request_uri = $_SERVER['REQUEST_URI'];
        }else{
            if (isset($_SERVER['argv'])){
                $request_uri = $_SERVER['PHP_SELF'] .'?'. $_SERVER['argv'][0];
            }else{
                $request_uri = $_SERVER['PHP_SELF'] .'?'. $_SERVER['QUERY_STRING'];
            }
        }
        $requesturlArr = explode($scriptName,$request_uri);
        if ($requesturlArr[1]!=""){
            $controller = Zend_Controller_Front::getInstance();
            $controller->setBaseUrl($requesturlArr[0].$scriptName);
        }
    }

其它地方就不需要設置了。
優點:不需要設置一個不確定的配置,這樣項目的移植性更強
缺點:非官方的寫法

其實在zf的使用中,找到解決方案是一種成果,但知道zf的原理纔是解決辦法的根源。
就拿zf的rewrite問題來說。主要要弄明白下面幾個地方:
問題的根源就是地址的格式是否能認的問題,在最新的zf中,主要就是BaseUrl的問題。只需要設置好BaseUrl,那麼zf裏面全部的地址就不需要rewrite功能了。
在zf的Zend_Application_Resource_Frontcontroller中就可以看到resources.frontController.baseurl 的執行代碼,說白了也就是執行$front->setBaseUrl($value);前提是你的baseurl 設置要設置正確。
而我自己的解決方案中也是執行setBaseUrl($value);,只不過是讓程序自己檢查baseurl的值,而不是另外的去設置一個值。

在Zend_Controller_Action_Helper_Url中,處理php的地址問題,認真的分析下去可以看到得到的地址一定是由baseurl組成
再看Zend_View_Helper_BaseUrl,裏面就有_removeScriptName($url),也就是把index.php去掉,否則<img src="/index.php/img/1.gif" /> 這樣的地址是不會正確顯示圖片的。
所以非php的地址就要使用Zend_View_Helper_BaseUrl得到正確的baseurl,這和我在“聽說現在zf最新版本可以不用rewrite了”寫的MyCore_View_Helper_FileUrl 是一樣的道理,只不過已經有了
官方的Zend_View_Helper_BaseUrl,就沒必要再寫一個MyCore_View_Helper_FileUrl了。
發佈了28 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章