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', '/');
}
posted @ 2014-05-14 09:58  帽子戏法  阅读(437)  评论(0编辑  收藏  举报
全部 html css js Linux php MySQL seo web git other 联系 管理