用户
 找回密码
 入住 CI 中国社区
搜索
查看: 7590|回复: 7
收起左侧

[讨论/交流] 关于CI路由的一个重要的问题

[复制链接]
发表于 2009-7-30 00:24:25 | 显示全部楼层 |阅读模式
谁都知道index.php是CI的入口  router类分析uri分配控制器以实现路由功能
在明白这些之前有一个很重要的问题很困惑

http://localhost/test.php/xyz   显示test.php的内容
http://localhost/test.htm/xyz   显示无法找到该页

服务器是wamp
test.php内容如下:
<?php
echo "test.php";
?>

就因为test.php是动态页而test.htm是静态页!?????????????????

如果/xyz是参数那么怎么获得,我测试了一下$_GET,$_POST,$_REQUEST都不能捕获/xyz,感觉这个'/'真诡异,到底是什么原理
发表于 2009-7-30 04:36:17 | 显示全部楼层
建议阅读system/libraries/uri.php和system/libraries/router.php源码,
论坛有人发布了带中文注解的CI,看过你就知道为啥了
 楼主| 发表于 2009-7-30 09:17:05 | 显示全部楼层
本帖最后由 ares333 于 2009-7-30 09:20 编辑

谢谢版主指点  不过我不是这个意思

我是想知道为什么以test.php结尾的url后面可以跟一个'/'加任意字符串而不会现无法找到该页
但是以test.htm结尾的url后面跟一个'/'加任意字符串就显示无法找到该页
当然test.php只输出一行字符串,没有任何其他功能

http://localhost/test.php/xyz我的理解是    这个网址访问test.php文件夹下的xyz文件(如果建立一个名为test.php文件夹 里面放一个xyz文件确实也能访问到这个文件)

比如有一个新的语言叫htmlx,我也想实现和CI一样的框架 但是如果我想用test.htmlx(相当于index.php,但是不实现任何功能)作为入口 但是访问
http://localhost/test.htmlx/xyz   显示无法找到该页,那么这个框架根本不可能实现

归根到底就是一句话 为什么.php结尾的url后面可以跟'/'加任意字符串而不会对访问产生任何影响而.htm(.html)结尾的url就不行
发表于 2009-7-30 09:27:32 | 显示全部楼层
http://localhost/test.html ,如果没有rewrite,他默认是访问html文件,不会加载php的东西
http://localhost/test.html/ ,表示要访问test.html目录,因为没有这个目录,所以显示404
http://localhost/test.php/xyz ,在CI中,如果你的CI入口是test.php,那么/xyz表示要调用xyz控制器,action是默认index()

为什么http://localhost/test.php/不报错呢?因为此时扩展名是.php,由php解析,至于CI怎么利用/,请参考源码
发表于 2009-7-30 09:28:42 | 显示全部楼层
据说某些蹩脚的服务商会将http://localhost/test.php/认成目录,不过俺还没遇到过这种情况
 楼主| 发表于 2009-7-30 10:36:44 | 显示全部楼层
谢谢版主
看了你的回复我这样来理解
以wamp为例
Apache肯定保存一个列表记录可以识别的各种后缀 .php .htm包含其中。
有一个请求比如http://localhost/test.php/xyz Apache遇到可识别的后缀.php,然后寻找test.php文件,找到了就交给PHP模块处理(因为是动态页,Apache不会解析后面的地址),所以后面的/xyz不影响,如果没找到test.php文件就认为他是一个目录,继续寻找test.php目录下的xyz文件(wamp可以识别test.php这样的目录)

但是http://localhost/test.htm/xyz就不同了  Apache遇到test.htm,(因为不是动态页,没有其他模块可以调用,所以继续解析url),然后认为浏览器请求的是test.htm目录下的xyz文件

上面这一切没有涉及到CI,但是没有这样的机制CI不可能实现路由(因为没有这样的机制http://localhost/index.php/hello这样的地址只能被认为是index.php目录中的hello文件)

个人理解,希望高手指教
发表于 2009-7-30 11:26:50 | 显示全部楼层
说这么多,实际上就是一个 PATH_INFO,index.php/xxxxx/xxx  这后面的就是一种 PATH_INFO 参数,并且不是所有情况下都有这个参数,需要服务器配合。
静态文件无法接收 PATH_INFO,我看是服务器本身的策略造成的,一个静态文件接收到 PATH_INFO 有什么用?所以说静态文件就是 404 错误了。
 楼主| 发表于 2009-7-30 13:48:44 | 显示全部楼层
本帖最后由 ares333 于 2009-7-30 13:55 编辑

7# Hex

正解!
very 3Q

本版积分规则