设为首页 收藏本站
查看: 824|回复: 0

[经验分享] PHP模拟 URL Rewrite

[复制链接]

尚未签到

发表于 2015-8-25 07:12:35 | 显示全部楼层 |阅读模式
$_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/}
  大功告成,明天继续测试和修改,欢迎大家提出意见。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-103725-1-1.html 上篇帖子: 我的面试php程序员的面试题 下篇帖子: php开发-工欲善其事必先利其器之工具篇
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表