对于单入口程序当中,往往用地址重写来美化URL地址。例如:
[code]http://www.meiu.cn/news/list/?type=11&page=2

http://www.meiu.cn/news/detail/123[/code]

1. 首先要在.htaccess中写一个地址重写
[code]<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond $1 !^(index\.php|public|robots\.txt)
RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>[/code]
2. 建一个index.php
[mycode=php]echo $_SERVER['PATH_INFO'];
?>[/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. 我的框架
[url=http://code.google.com/p/simplephp/downloads/list]http://code.google.com/p/simplephp/downloads/list[/url]
大家可以参考一下。

 

0 Responses to 使用PATH_INFO美化URL

  1. sum 说道:

    您的框架和CI比,有哪些区别呢?

  2. Dwspider 说道:

    方法一般,不过代码太眼熟了

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*
验证你是否是机器人,请输入以下图片中的单词。 点击图片可以收听此验证码。
点击收听验证码