关于CI路由的一个重要的问题
谁都知道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,感觉这个'/'真诡异,到底是什么原理 建议阅读system/libraries/uri.php和system/libraries/router.php源码,
论坛有人发布了带中文注解的CI,看过你就知道为啥了 本帖最后由 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就不行 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怎么利用/,请参考源码 据说某些蹩脚的服务商会将http://localhost/test.php/认成目录,不过俺还没遇到过这种情况 谢谢版主{:2_32:}
看了你的回复我这样来理解
以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文件)
个人理解,希望高手指教 说这么多,实际上就是一个 PATH_INFO,index.php/xxxxx/xxx这后面的就是一种 PATH_INFO 参数,并且不是所有情况下都有这个参数,需要服务器配合。
静态文件无法接收 PATH_INFO,我看是服务器本身的策略造成的,一个静态文件接收到 PATH_INFO 有什么用?所以说静态文件就是 404 错误了。 本帖最后由 ares333 于 2009-7-30 13:55 编辑
7# Hex
正解!
very 3Q
页:
[1]