选择网速最快的镜像: 北京联通 | 美国加州Fremont | 美国宾州Scranton .
美国VPS: 512M/20G/独立IP/仅需$5.95[北京]美国公司 招聘PHP工程师村民红杏要出墙

把你的网页装饰为伪静态链接

大家都知道,搜索引擎对动态页面收录不是很好,静态页面在这方面就很有优势。而有些空间不支持rewrite功能。那么可以在每个页面运行下面这个函数。
这样,就可以以http://qh8.net/test/test.php/a/1/b/2/c/3 或http://qh8.net/test/test.php?a=1&b=2&c=3 两种方式访问了。得到的GET变量是一样的。
<?php
function mod_rewrite(){
        if(isset($_SERVER['PATH_INFO'])){
                $url = substr($_SERVER['PATH_INFO'],1);
                $url = explode('/',$url);
                foreach ($url as $key =>$value){
                        if($key%2!=1){
                                if($value!='')$_GET[$value]=$url[$key+1];
                                $querystring[]=$value.'='.$url[$key+1];
                        }
                }
                $_SERVER['QUERY_STRING']=implode("&",$querystring);
                $_SERVER['PHP_SELF']=substr($_SERVER['PHP_SELF'],0,strpos($_SERVER['PHP_SELF'],'.php')+4);
                $_SERVER['REQUEST_URI']=$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'];
        }
}

mod_rewrite();
/*例子
http://qh8.net/test/test.php/a/1/b/2/c/3
echo '<pre>';
echo "GET数组如下:<br />";
print_r($_GET);
Array
(
    [a] => 1
    [b] => 2
    [c] => 3
)
*/


?>

[[i] 本帖最后由 qh663 于 2006-6-23 08:09 PM 编辑 [/i]]
五百多篇PHP学习资料
喜悦村BLOG
php团队接兼职项目QQ:80031807
PHP群:768844
可是~有的空间连.php/a/1都不支持的~
矛盾是发展的源泉。
不是所有空间都支持PATH_INFO的
如果自己有服务器也就不必用PATH_INFO了
不过文章还是很不错的
现在没必要弄成那样得了,搜索引擎现在支持动态得了。
绝大多数空间都支持 PATH_INFO的,也有很大部份不支持rewrite。所以,如果服务器不支持rewrite,仿静态是最好的选择。仿静态理由是更好地被收录。以搜索引擎的原理,html页面的检索远远优先于php的QUERY_STRING网页。这个而不影响原来的程序调用,相当于加了一个转义的功能插件。
五百多篇PHP学习资料
喜悦村BLOG
php团队接兼职项目QQ:80031807
PHP群:768844
[php]<?php

/**
* $Id$
* Filename : rewrite.mod.php
* Author   : 额系菜屁屁
* Email    : lianxiwoo@gmail.com | hotmail.com
* Create   : 200606
* LastMod  : 2006
* Usage    : 只需在你所有的页面有输出之前包含此文件即可判断你的环境是否支持 path_info
*
* $_SERVER['PATH_INFO_SURPORT'] 为 1 说明环境支持,为 0 不支持
* $_SERVER['MOD_REWRITE_OPEN']  为 1 说明系统用了 path_info 为 0 说明没有用
*/

//ini_set('display_errors', 1);
//error_reporting(E_ALL ^ E_NOTICE);
//header("Content-Type: text/plain");
//header("Content-type: text/html; charset=UTF-8");


// {{{ 判断是否支持 path_info
if (isset($_GET['testModRewrite']) && $_GET['testModRewrite']){
        if (str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['PHP_SELF'])){
                die('1');
        }else{
                die('');
        }
}
$a_20060623 = strtolower(str_replace(strstr($_SERVER['SERVER_PROTOCOL'], '/'), "", $_SERVER['SERVER_PROTOCOL'])).'://'.$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME'];
if ($a_20060623 = file_get_contents($a_20060623.'/a/1?testModRewrite=1')){
        $_SERVER['PATH_INFO_SURPORT'] = 1;
}else{
        $_SERVER['PATH_INFO_SURPORT'] = 0;
}
unset($a_20060623);
// }}}
// {{{
/**
* 注意:stristr 需要 php5 支持
*
* @createtime   20060623
* @author       屁屁注:此作者还是楼主,我这里只是做个补充,谢谢,^_^
* @modifiedby   $LastChangedBy:  $
* @parameter   
* @return      
* @throws       none
*/
function mod_rewrite(){
        if(isset($_SERVER['PATH_INFO']) && !stristr($_SERVER['SERVER_SOFTWARE'], 'Abyss')){
                $pi = substr($_SERVER['PATH_INFO'], 1);
                $pi = explode('/', $pi);
                $a = sizeof($pi);
                $qs = array();
                for($i = 0; $i < $a; $i += 2){
                        if ('' != $pi[$i]){
                                $_GET[$pi[$i]] = $pi[$i+1];
                                $qs[] = $pi[$i].'='.$pi[$i+1];
                        }
                }
                $_SERVER['QUERY_STRING'] = join("&", $qs);
                $_SERVER['PHP_SELF']     = str_replace($_SERVER['PATH_INFO'], "", $_SERVER['REQUEST_URI']);
                $_SERVER['REQUEST_URI']  = $_SERVER['PHP_SELF'].($_SERVER['QUERY_STRING'] ? '?'.$_SERVER['QUERY_STRING'] : '');
                $_SERVER['SCRIPT_URL']   = $_SERVER['PHP_SELF'];
                $_SERVER['SCRIPT_URI']   = strtolower(str_replace(strstr($_SERVER['SERVER_PROTOCOL'], '/'), "", $_SERVER['SERVER_PROTOCOL'])).'://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
                $_SERVER['MOD_REWRITE_OPEN']  = 1;
        }else{
                $_SERVER['MOD_REWRITE_OPEN']  = 0;
        }
}

mod_rewrite();

/**/
echo '<xmp>';
print_r($_SERVER);
echo '</xmp>';


// }}}

?>[/php]

下面是附件,需要把 .rar 去掉

[ 本帖最后由 额系菜屁屁 于 2006-6-24 01:10 AM 编辑 ]
附件: 您所在的用户组无法下载或查看附件
原来函数的那句 isset($_SERVER['PATH_INFO']) 就已经检测了是否支持 PATH_INFO 。stristr函数从PHP3就支持了。没看懂 !stristr($_SERVER['SERVER_SOFTWARE'], 'Abyss')这句。

我试了下,在linux服务器下显示
[SERVER_SOFTWARE] => Apache/1.3.33 (Unix) PHP/4.4.2
win服务器下
[SERVER_SOFTWARE] => Apache/2.0.50 (Win32) PHP/5.0.0

呵呵,简单是美。如果对不支持 PATH_INFO 但已经写成的伪静态的话。可以在输出内容之前把链接替换一下就可以了。
五百多篇PHP学习资料
喜悦村BLOG
php团队接兼职项目QQ:80031807
PHP群:768844
原帖由 qh663 于 2006-6-24 03:26 PM 发表
原来函数的那句 isset($_SERVER) 就已经检测了是否支持 PATH_INFO 。stristr函数从PHP3就支持了。没看懂 !stristr($_SERVER, 'Abyss')这句。

我试了下,在linux服务器下显示
=> Apache/1.3.33 (Unix) PHP ...
1,stristr 是我记错了,strripos 是 php 5 才支持的,记错,不好意思。

2,Abyss ( http://www.aprelium.com/abyssws/ )是另一个 web 服务器,不管怎么样,打印 $_SERVER['PATH_INFO'] 始终有值,并且跟 SCRIPT_NAME 一样,故有此判断。

3,isset($_SERVER) 只是判断了是否使用了 PATH_INFO ,而不能判断服务器php运行环境是否支持,即开启了 AcceptPathInfo on 这个。on/off,

* $_SERVER['PATH_INFO_SURPORT'] 为 1 说明环境支持,为 0 不支持
* $_SERVER['MOD_REWRITE_OPEN']  为 1 说明系统用了 path_info 为 0 说明没有用

这个即是说明

4,以上程序是建立在的测试结果之上。

5,欢迎继续探讨
提示: 作者被禁止或删除 内容自动屏蔽
原帖由 奶并瓦 于 2006-6-24 05:09 PM 发表
楼主的代码问题多多
考虑全局变量,你至少少个$a这样的,而且很多人不要$_GET变量,而用$_REQUEST
比如我就喜欢用$_REQUEST的,又时候id不管GET,POST就用$_REQUEST
不是说我吧? 如果不用 get 那么 $_SERVER['MOD_REWRITE_OPEN'] 就为 0 了,就不用这种机制处理了,是吧,使用的时候可以根据 $_SERVER['MOD_REWRITE_OPEN']  这个变量来判断。

这只是一种伪静态的处理方式,当然不是通用、万能的解决方案, 这种方法作为解决某个问题一种方式,我还是比较赞同滴。