CakePHP:链接地址问题(不用mod_rewrite,IIS)
实现的友好的urls,固然很好,但是有些场合因为服务器的原因等,我们无法使用重写规则,特别是当我们用CakePHP开发应用产品的时候,必须 考虑到用户不同的部署环境,所以必须考虑到不用urls重写,网站的链接地址方式。CakePHP的官方文档等默认的都是支持Url重写,强调一个约定环 境,约定目录,而实际生产环境于此不同,又不受控制。笔者在用CakePHP开发一个应用,部署时发现环境不支持Url重写,不得不回过头来修改代码,将 其中遇到的问题,发现这方面的资料很少,所以总结了一下,与大家一起探讨。
实际链接地址
/index.php?url=controllername/actionname/param,调试时常常用到
要实现不同环境的部署,网站的所有链接地址要使用Helper的HTML助手的link、url方法,不要直接写地址,这是刚开使用框架是最容易忽略的问题,等程序开发完了,再回来修改,还是很费精力的。
不支持url重写的配置
/app/config/core.php取消对其注释
Configure::write('App.baseUrl', env('SCRIPT_NAME'));
删除
/.htaccess /app/.htaccess /app/webroot/.htaccess
链接地址由 www.example.com/controllername/actionname/para 变为
www.example.com/index.php/controllername/actionname/param
问题:
www.example.com/index.php/controllername/actionname/param的模式会报告404错误,无法找到文件,修改为index.php?controllername/actionname/param可以实现访问,那
么实现 index.php/controllername访问,是需要配置web服务器、PHP、CakePHP,还是就是CakePHP
bug,应该生成的是index.php?controllername,官方文档没有发现有关此的任何信息,像是这个问题根本就不存在一样,这不是个问
题吗?我对Url,参数传递知道的太少了吗?都是用?传递参数,搜索了也没有找到想要的说明。(后来试验发现,Apache可以使用/传递参数可以实现访问,我这里用的是IIS5.0服务器),所以CakePHP对于IIS的支持存在bug,跟踪html->url()方法:
cake/libs/router.php第857行,将
$output = str_replace('//', '/', $base . '/' . $output);
修改为
$output = str_replace('//', '/', $base . '?' . $output);
目录设置问题
├─web_root 根目录 │ └─应用目录 │ ├─应用目录 │ └─app 应用目录 └─cake cake目录
按文档进行配置webroot/应用目录/index.php
if (!defined('ROOT')) { define('ROOT', dirname(dirname(dirname(__FILE__))).DS.'应用目录'); } if (!defined('APP_DIR')) { define('APP_DIR', 'app'); }
问题:CSS、img等路径出现问题,页面无法正常访问
跟踪源码,这里设置
cake/dispatcher.php
if (strpos($this->webroot, $dir) === false) { $this->webroot .= $dir . '/' ;//$dir=APP_DIR }
解决:
去掉应用目录的app层,修改
if (!defined('APP_DIR')) { define('APP_DIR', '/'); }