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

来源:互联网 发布:maya2016软件配置要求 编辑:程序博客网 时间:2024/05/04 04:37
在实际项目中,应该是把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了。
原创粉丝点击