使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了。
现在租用的空间中几乎都会支持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了。
- 使zf在不支持rewrite功能下能正常工作的各种办法
- 修复jquery.cookie的bug,使其能在IE浏览器下正常工作
- CodeSmith绿色化的情况下,又能使之正常工作
- 解析下zf工作目录下的init_autoloader.php
- Ubuntu下启动Apache的Rewrite功能
- thinkcmf在apache中无法启用rewrite的修改办法
- 基于ZF中的.htaccess文件学习Apache的Rewrite语法
- 基于ZF中的.htaccess文件学习Apache的Rewrite语法
- Yii在Nginx下的rewrite配置
- Yii在Nginx下的rewrite配置
- 不依赖于DLL就能正常工作的全局钩子
- 不依赖于DLL就能正常工作的全局钩子
- 不依赖于DLL就能正常工作的全局钩子
- apache的rewrite功能
- 解决公司oracle数据库服务器,在不能上网的情况下数据库也能正常的在局域网中使用
- 在ubuntu中使用apache的rewrite功能
- opencms module developer Eclipse插件在OpenCms7.5下无法正常工作的解决
- WatiN+Nunit在Win Server 2008 R2下不能正常工作的解决方法
- 好久没写文章了,
- 如何提高论文被三大检索系统收录的几率
- 关于Qt信号与槽机制的传递方向性研究
- 初来csdn!
- ASP.NET MVC3中使用IClientValidatable接口实现客户端和服务器端同时验证
- 使zf在不支持rewrite功能下能正常工作的各种办法
- 那些开发《虚拟光驱》的人们
- 使用zfdebug调试zend framework
- 电子商务系统企业级功能
- 和大家探讨一下“虚拟光驱”原理
- 权力和学习
- B2C赢利的公式
- 有点累了!
- zendframework多表查询