代码说

code is poetry

代码说    
碎碎念:站点更新完成!各位访问站点的亲你们有福了,有美女看哦,O(∩_∩)O~  换一换

访问CI中的application或者system文件夹内的文件时返回403 Forbidden的问题

作者:coderzheng 发布于:2015-2-25 1:44 Wednesday 分类:php  阅读模式

仔细研究CI的文件组织和程序架构,跟着手册走能快速完成一个基本的news应用。但是问题还很多,比较典型一个问题就是:如何在CI中对前端页面需要引用的css、js及图片、字体等文件进行引用?这些文件夹应当如何组织?
我试图直接将css、js这些资源放在views层的文件夹下,因为这样前端程序员可以很容易地对css、js及模版文件进行整理(特别是模版和css、js在一个目录下时)。一种方式是:先在application/config/config.php文件中定义css等文件夹的路径,就像这样:
$config['css_path'] = "http://dev.ci.com/" . APP_PATH . "views/css/";
然后可以在views下面的模版文件中这样引用:
<link href="<?php echo $this->config->items('css_path')?>test.css" rel="stylesheet" media="screen">
然后像正常的方式一样去访问,遗憾的是css文件并没有生效:

看来我又想当然了,接下来来找出原因。仔细分析一下这个url:http://dev.ci.com/application/views/css/test.css
首先CI并不会对这个路径按照mvc的方式去进行解析,因为这个url不是以index.php作为入口的。其实这里就引入了另一个问题:如何更改codeIgniter的路径显示?比如我们想要隐藏index.php,该怎么做呢?在手册里面有这样一段:

很显然,必须使用.htaccess来进行url重定向。如果你再仔细一点,应该可以看到上图其实已经告诉我们如何对css、js文件进行处理了,其实就是在application和system同级的目录下放置css和js文件夹,用来在程序中对这些文件夹下的文件进行寻址。
至此,我们已经解决了本文开头提到的问题,但是这和文章标题并没有关系。
继续回到之前的问题,对http://dev.ci.com/applicaiton/views/css/test.css这个url,为什么页面会返回403 Forbbiden呢?按现在的规则,CI不会对这个url进行MVC解析,根目录下的.htaccess文件也不会对它进行重定向,究竟是什么原因呢?
为了尽快找到线索,我使用了editplus的文本搜索(全文件夹遍历),对包含搜索文本的文件进行定位。

遗憾的是,我们再次无功而返,没有找到任何文件:

最后,我只好对http://dev.ci.com/applicaiton/views/css/test.css这个路径进行单步调试,先砍掉后面的部分,直接访问
http://dev.ci.com/application/, 依然返回403 Forbidden,这个url并没有寻址到application下的index.html!
百思不得其解时,猛然看到application下也有一个.htaccess!
打开一看:
deny from all.
至此,所有问题都解决了。

这里不得不吐槽一下CI的设计,依赖.htaccess来控制用户的访问需要服务器端开启url重写模块,如果服务器端没开启呢?又或者站点程序不是部署在apache下而是nginx下呢?
所以这里更好的做法应该是定义程序员在applicaiton文件夹下写php代码的规范,比如强制在程序头加下面的代码:
if ( ! defined('BASEPATH')) exit('No direct script access allowed');
这样就相当于对所有绕过index.php文件来寻址的访问方式进行了拒绝。

PS: 关于.htaccess,有一个文件夹嵌套时的访问权限规则,这个部分请查看apache手册,不再赘述。

over.

标签: 疑难杂症 codeIgniter

你可以发表评论、引用到你的网站或博客,或通过RSS 2.0订阅这个博客的所有文章。
上一篇: virtualbox在桥接模式下设置centos6.4为静态IP时无法连结外网的问题  |  下一篇:CI中自定义库类引用config对象的方法失败的问题