标题:使用PATH_INFO美化URL 出处:简单生活 时间:Tue, 13 Jan 2009 10:10:08 +0000 作者:baoling 地址:http://blog.meiu.cn/pathinfo/ 内容: 对于单入口程序当中,往往用地址重写来美化URL地址。例如: http://www.meiu.cn/news/list/?type=11&page=2 http://www.meiu.cn/news/detail/123 1. 首先要在.htaccess中写一个地址重写 RewriteEngine on RewriteCond $1 !^(index\.php|public|robots\.txt) RewriteRule ^(.*)$ index.php/$1 [L] 2. 建一个index.php [mycode=php][/mycode] 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。 [mycode=php]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']; } }[/mycode] 你可以通过上面的 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 大家可以参考一下。 Generated by Bo-blog 2.1.1 Release