PHP模拟 URL Rewrite

$_SERVER['PATH_INFO']更方便,查看了一些关于 $_SERVER['PATH_INFO']的资料,对模拟 URL Rewrite 重新进行了修改。

目的是一样的,但并没有使用类了,而是直接将获取到的信息写入 $_GET$_SERVER["QUERY_STRING"] 预定义变量,跟昨天的做法一样,新增 $_SERVER["R_QUERY_STRING"] 来存储模拟后的 QueryString。

并增加了对URL中存在 / 符号的解决办法,自动添加花括号以表示区别,测试用$_GET取值和生成Rewrite都很正常。

下面是代码的内容:

<?
    
function BuildRewriteURL ( $string , $UrlStyle = 0 ) {
        
if ( strpos ( $string , ' ? ' )) {
            
$StrArray = explode ( ' ? ' , $string ) ;
            
$Page = $StrArray [ 0 ] ;
            
$ParaString = $StrArray [ 1 ] ;
        
}
        
else $ParaString = $string ;
        
$ParaString = str_replace ( ' ? ' , '' , $ParaString ) ;
        
if ( ! strpos ( $ParaString , ' & ' )) return $this -> ParaString ;
        
$URLArray = explode ( ' & ' , $ParaString ) ;
        
for ( $i = 0 ; $i < count ( $URLArray ) ; $i ++ ) {
            
$Para = explode ( ' = ' , $URLArray [ $i ]) ;
            
if ( ! empty ( $Para [ 1 ])) {
                
if ( ! empty ( $UrlString )) $UrlString .= ' / ' ;
                
if ( strpos ( $Para [ 0 ] , ' / ' )) $Para [ 0 ] = ' { ' . $Para [ 0 ] . ' } ' ;
                
if ( strpos ( $Para [ 1 ] , ' / ' )) $Para [ 1 ] = ' { ' . $Para [ 1 ] . ' } ' ;
                
$UrlString .= $Para [ 0 ] . ' / ' . $Para [ 1 ] ;
            
}
        
}
        
switch ( $UrlStyle ) {
            
case 1 : $AddString = ' / ' ; break ;
            
case 2 : $AddString = '' ; break ;
            
default : $AddString = ' .html ' ; break ;
        
}
        
return str_replace ( ' // ' , ' / ' , $Page . ' / ' . $UrlString . $AddString ) ;
    
}
 
    
$QueryString = ! empty ( $_SERVER [ ' PATH_INFO ' ]) ? $_SERVER [ ' PATH_INFO ' ] : str_replace ( $_SERVER [ " SCRIPT_NAME " ] , '' , $_SERVER [ " REQUEST_URI " ]) ;
    
$QueryString = str_replace ( array ( ' " ' , " ' " , ' < ' , ' > ' ) , array ( ' %22 ' , ' %27 ' , ' %3C ' , ' %3E ' ) , $QueryString ) ;
    
if ( strrpos ( $QueryString , " & " ) && strrpos ( $QueryString , " & " )) { // 当URL为原始状态时
        
$ParaArray = explode ( ' & ' , $_SERVER [ " QUERY_STRING " ]) ;
        
for ( $i = 0 ; $i < count ( $ParaArray ) ; $i ++ ) {
            
if ( strpos ( $ParaArray [ $i ] , ' = ' ) + 1 != strlen ( $ParaArray [ $i ])) {
                
$Para = explode ( ' = ' , $ParaArray [ $i ]) ;
                
if ( ! empty ( $Para [ 1 ])) {
                    
if ( strpos ( $Para [ 0 ] , ' / ' )) $Para [ 0 ] = ' { ' . $Para [ 0 ] . ' } ' ;
                    
if ( strpos ( $Para [ 1 ] , ' / ' )) $Para [ 1 ] = ' { ' . $Para [ 1 ] . ' } ' ;
                    
$RequestURL .= ' / ' . $Para [ 0 ] . ' / ' . $Para [ 1 ] ;
                
}
            
}
        
}
        
$_SERVER [ " R_QUERY_STRING " ] = $RequestURL ;
    
}
    
elseif ( strrpos ( $QueryString , " / " )) { // 当URL为模拟 URL Rewrite 时
        
$QueryString = str_replace ( ' .html ' , '' , $QueryString ) ;
        
$_SERVER [ " R_QUERY_STRING " ] = $QueryString ;
        
preg_match_all ( " /{(.*)}/U " , $QueryString , $matches ) ;
        
for ( $i = 0 ; $i < count ( $matches [ 0 ]) ; $i ++ ) {
            
$QueryString = str_replace ( $matches [ 0 ][ $i ] , rawurlencode ( $matches [ 1 ][ $i ]) , $QueryString ) ;
        
}
        
$ParaArray = explode ( ' / ' , $QueryString ) ;
        
for ( $i = 0 ; $i < count ( $ParaArray ) ; $i = $i + 2 ) {
            
if ( ! empty ( $ParaArray [ $i + 1 ])) {
                
if ( ! empty ( $RequestURL )) $RequestURL .= ' & ' ;
                
if ( strpos ( $ParaArray [ $i + 1 ] , ' %2F ' )) $ParaArray [ $i + 1 ] = rawurldecode ( $ParaArray [ $i + 1 ]) ;
                
if ( strpos ( $ParaArray [ $i + 2 ] , ' %2F ' )) $ParaArray [ $i + 2 ] = rawurldecode ( $ParaArray [ $i + 2 ]) ;
                
$StrArray [ $ParaArray [ $i + 1 ]] = $ParaArray [ $i + 2 ] ;
                
$RequestURL .= $ParaArray [ $i + 1 ] . " = " . $ParaArray [ $i + 2 ] ;
            
}
        
}
        
$_GET = $StrArray ;
        
$_SERVER [ ' QUERY_STRING ' ] = $RequestURL ;
    
}
    
unset ( $QueryString , $ParaArray , $Para , $StrArray , $RequestURL , $matches , $i ) ;
 
    
echo ' <hr /> ' ;
    
echo ' <br />$_SERVER["REQUEST_URI"] = ' . $_SERVER [ ' REQUEST_URI ' ] ;
    
echo ' <br />$_SERVER["QUERY_STRING"] = ' . $_SERVER [ ' QUERY_STRING ' ] ;
    
echo ' <br />$_SERVER["R_QUERY_STRING"] = ' . $_SERVER [ ' R_QUERY_STRING ' ] ;
    
echo ' <hr /> ' ;
    
echo ' $_GET[ \' a \' ] = ' . $_GET [ ' a ' ] . ' <br /> ' ;
    
echo ' $_GET[ \' b \' ] = ' . $_GET [ ' b ' ] . ' <br /> ' ;
    
echo ' $_GET[ \' c \' ] = ' . $_GET [ ' c ' ] . ' <br /> ' ;
    
echo ' $_GET[ \' d \' ] = ' . $_GET [ ' d ' ] . ' <br /> ' ;
    
echo ' $_GET[ \' u/rl \' ] = ' . $_GET [ ' u/rl ' ] . ' <br /> ' ;
    
echo ' <hr /> ' ;
    
echo ' BuildRewriteURL( \' /test.php?a=123&b=456&c=&d=789&u/rl=http://www.163.com/ \' ) = ' . BuildRewriteURL ( ' /test.php?a=123&b=456&c=&d=789&u/rl=http://www.163.com/ ' ) . ' <br /> ' ;
    
echo ' BuildRewriteURL( \' /?a=123&b=456&c=&d=789&u/rl=http://www.163.com/ \' , \' 1 \' ) = ' . BuildRewriteURL ( ' /?a=123&b=456&c=&d=789&u/rl=http://www.163.com/ ' , ' 1 ' ) . ' <br /> ' ;
    
echo ' BuildRewriteURL( \' a=123&b=456&c=&d=789&u/rl=http://www.163.com/ \' , \' 2 \' ) = ' . BuildRewriteURL ( ' a=123&b=456&c=&d=789&u/rl=http://www.163.com/ ' , ' 2 ' ) . ' <br /> ' ;
?>

测试1的URL地址为:http://localhost:808/test.php/a/123/b/456/d/789/{u/rl}/{http:/www.163.com/}.html
输出结果:

————————————————————-
$_SERVER["REQUEST_URI"] = /test.php/a/123/b/456/d/789/{u/rl}/{http:/www.163.com/}.html
$_SERVER["QUERY_STRING"] = a=123&b=456&d=789&u/rl=http:/www.163.com/
$_SERVER["R_QUERY_STRING"] = /a/123/b/456/d/789/{u/rl}/{http:/www.163.com/}
————————————————————-
$_GET['a'] = 123
$_GET['b'] = 456
$_GET['c'] =
$_GET['d'] = 789
$_GET['u/rl'] = http:/www.163.com/
————————————————————-
BuildRewriteURL('/test.php?a=123&b=456&c=&d=789&u/rl=http://www.163.com/') = /test.php/a/123/b/456/d/789/{u/rl}/{http:/www.163.com/}.html
BuildRewriteURL('/?a=123&b=456&c=&d=789&u/rl=http://www.163.com/', '1') = /a/123/b/456/d/789/{u/rl}/{http:/www.163.com/}/
BuildRewriteURL('a=123&b=456&c=&d=789&u/rl=http://www.163.com/', '2') = /a/123/b/456/d/789/{u/rl}/{http:/www.163.com/}

测试2的URL地址为:http://localhost:808/test.php?a=123&b=456&c=&d=789&u/rl=http://www.163.com/
输出结果:

————————————————————-
$_SERVER["REQUEST_URI"] = /dcep2/test.php?a=123&b=456&c=&d=789&u/rl=http://www.163.com/
$_SERVER["QUERY_STRING"] = a=123&b=456&c=&d=789&u/rl=http://www.163.com/
$_SERVER["R_QUERY_STRING"] = /a/123/b/456/d/789/{u/rl}/{http://www.163.com/}
————————————————————-
$_GET['a'] = 123
$_GET['b'] = 456
$_GET['c'] =
$_GET['d'] = 789
$_GET['u/rl'] = http://www.163.com/
————————————————————-
BuildRewriteURL('/test.php?a=123&b=456&c=&d=789&u/rl=http://www.163.com/') = /test.php/a/123/b/456/d/789/{u/rl}/{http:/www.163.com/}.html
BuildRewriteURL('/?a=123&b=456&c=&d=789&u/rl=http://www.163.com/', '1') = /a/123/b/456/d/789/{u/rl}/{http:/www.163.com/}/
BuildRewriteURL('a=123&b=456&c=&d=789&u/rl=http://www.163.com/', '2') = /a/123/b/456/d/789/{u/rl}/{http:/www.163.com/}

大功告成,明天继续测试和修改,欢迎大家提出意见。

转载于:https://www.cnblogs.com/kuyuecs/archive/2008/12/23/1360512.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值