使用PATH_INFO美化URL 不指定

2009年1月13日 评论(2) 阅读(2652) | |
对于单入口程序当中,往往用地址重写来美化URL地址。例如:
http://www.meiu.cn/news/list/?type=11&page=2
http://www.meiu.cn/news/detail/123

1. 首先要在.htaccess中写一个地址重写
<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond $1 !^(index\.php|public|robots\.txt)
  RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>

2. 建一个index.php
<?php
echo $_SERVER['PATH_INFO'];
?>

3. URL路由
如果输入 http://www.meiu.cn/news/list/?type=11&page=2 这样的地址,你将得到 /news/list 这样的值。
这样你可以将news作为控制器,list作为Action。
至于?后面的可以正常用$_GET来获取了。
具体的URL路由,这里就不阐述了,基本就是把问号前的地址explode一下,获得一个数组,然后就方便解决了。

4. 有时候用PHP的CGI方式配置的服务器上不能获取到 PATH_INFO,这样我们就没法获取PATH_INFO了吗?
不是,可以用类似的方法获取
由于CGI方式获取的SCRIPT_NAME也有问题,因此我从Zend Framework里面抽取了一个函数用来获取正确的SCRIPT_NAME,结合PHP_SELF同样可以获取到PATH_INFO。
function _getScriptPath(){
  $filename = basename($_SERVER['SCRIPT_FILENAME']);
        if (basename($_SERVER['SCRIPT_NAME']) === $filename) {
            $baseScript = $_SERVER['SCRIPT_NAME'];
        } elseif (basename($_SERVER['PHP_SELF']) === $filename) {
            $baseScript = $_SERVER['PHP_SELF'];
        } elseif (isset($_SERVER['ORIG_SCRIPT_NAME']) && basename($_SERVER['ORIG_SCRIPT_NAME']) === $filename) {
            $baseScript = $_SERVER['ORIG_SCRIPT_NAME']; // 1and1 shared hosting compatibility
        } else {
            $path    = $_SERVER['PHP_SELF'];
            $segs    = explode('/', trim($_SERVER['SCRIPT_FILENAME'], '/'));
            $segs    = array_reverse($segs);
            $index   = 0;
            $last    = count($segs);
            $baseScript = '';
            do {
                $seg     = $segs[$index];
                $baseScript = '/' . $seg . $baseScript;
                ++$index;
            } while (($last > $index) && (false !== ($pos = strpos($path, $baseScript))) && (0 != $pos));
        }
  return $baseScript;
}

function parsePathInfo(){
   if ( ! isset($_SERVER['PATH_INFO']) || $_SERVER['PATH_INFO'] == ''){
            $strlen = strlen(_getScriptPath());
            $totallen = strlen($_SERVER['PHP_SELF']);
        return substr($_SERVER['PHP_SELF'],$strlen,$totallen);
        }else{
          return $_SERVER['PATH_INFO'];
        }
}


你可以通过上面的 parsePathInfo() 来获取PATH_INFO。

5. BUG?
在Linux环境下 如果是 /index/test 这样的地址用PATH_INFO只会得到 /test ,PHP_SELF同样也只能得到 /index.php/test,所以无法确定是不是php的一个bug。哪位大大知道的话,方便的话,留个话,解决这个不解之谜。

6. 我的框架
http://code.google.com/p/simplephp/downloads/list
大家可以参考一下。
Via 本站原创
作者:baoling | 分类:技 术 知 识 Tags:
sum @2010年1月29日 14:16 Email
您的框架和CI比,有哪些区别呢?
baoling 回复于 2010年1月31日 14:04
区别不是很大,主要是替换了Database的类,用我自己的代替。模板引擎稍作替换,加入了缓存类,表单验证类,ACL权限控制(暂时还不完善),还有gettext。另外加载器有所不同,我用“Loader”这个超级加载器,取代了CI里默认的加载器,可以加载单例的database对象,model,view,config,lib和helper。
改写它的原因是由于自己来负责更新,有了bug自己处理,对于CI我用不惯的地方换成自己习惯的方式,但是我不推荐大家使用我的框架。
Dwspider @2009年11月12日 02:54 Email
方法一般,不过代码太眼熟了
分页: 1/1 第一页 1 最后页
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]