現在租用的空間中幾乎都會支持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了。