免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1051 | 回复: 0
打印 上一主题 下一主题

SEO-URL优化程序beta0.1更新至0.2版本 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-22 11:43 |只看该作者 |倒序浏览
更新日志:
2007-8-29 更新至beta0.2版本
          a  增加了去掉index.php的功能(可以开启或关闭),增加.htaccess配置文件供参考。
          b  解决了在去掉“index.php”模式下(apache开启了RewriteEngine)的,图片或者css文件的调用出错问题。

SEO的重要性就不熬诉了,现在的MVC框架一般可以通过路由(route)的配置及遵守其规则来实现SEO的优化(url方面)。但早期的一些框架,如国内的PFC3,或者我们自己写的mvc框架往往都忽视了这点。

eg:
1 /index.php?module=public&action=quickseach&time=2007&count=100
2 /search/time/2007/count/100

显而易见,对于搜索引擎而言,第2个url会比第一个url友好得多。从我以前的项目来看,google两种url都会收录,但百度只能收录第2种。如果百度不能收录,对于国内的网站而言,无异于残废了~

so,我自己写了个扩展,并添加于我以前的一个项目中(采用的pfc3)。相信稍作修改就可以直接用于其他MVC框架。

源码

示例文件index.php(实际使用时必须为单一入口程序的入口):
beta0.1版本的,最新版请直接下载最下面的压缩包
?php
/*
该文件为:首页示例
程序:MVC框架SEO优化程序 beta.0.1
作者:放弃思考 or j(QQ:376123224)
Blog: http://j.cublog.cn/ Email: huajiehe@yahoo.com.cn
时间:2007-8-23
*/
include_once( './config/route.inc.php' );//路由配置文件
include_once( './config/routing.php' );//路由器
echo '模块为:'.$_GET['module'].'
';
echo '页面为:'.$_GET['action'].'
';
echo '
$_GET 数组:';
print_r( $_GET );
echo '
';
echo '
$_REQUEST 数组:';
print_r( $_REQUEST );
echo '
';
?>
br>br>
a href="" target="_self">链接转化1:./index.php?page=1&module=public&action=newdiarys/a>
br>br>
a href="" target="_self">链接转化2:/index.php?page=1&a=xxx&b=ccc/a>--默认module和action的情况
br>br>
a href="" target="_self">链接转化3:index.php?action=newdiarys&page=1/a>--默认module的情况
br>br>
a href="" target="_self">链接转化4:index.php?module=visit&action=diaryview&uid=10066&diary_id=17196/a>--多参数的情况
br>br>
a href="" target="_self">font color="red">简化的链接1:seach/time/2007/count/100/font>/a>--简化的url情况1:*号表示规则
br>br>
a href="" target="_self">font color="red">简化的链接2:diaryview/10066/17196/font>/a>
br>br>
a href="" target="_self">font color="red">简化的链接3:picview/1234/5678/font>/a>
路由配置文件route.inc.php:
beta0.1版本的,最新版请直接下载最下面的压缩包
?php
/*
该文件为:路由配置文件
程序:MVC框架SEO优化程序 beta.0.1
作者:放弃思考 or j(QQ:376123224)
Blog: http://j.cublog.cn/ Email: huajiehe@yahoo.com.cn
时间:2007-8-23
*/
/*允许的模块定义
/*--------------------------------------------------------------------------*/
$legal_modules = array('default','public','tribe','visit','search','album');
/* 一些重要的,特定的页面,url简化规则
* eg: 下面的设置将使得:
* /seach/time/2007/count/100 表示 index.php?module=public&action=quickseach&time=2007&count=100
* /diaryview/12/34 表示 ?module=visit&action=diary&uid=12&diary=34
* /picview/123/456 表示 ?module=album&action=picview&uid=123&pic_id=456
/*--------------------------------------------------------------------------*/
$route_rule = array(
'search' => array('public','quickseach','*'),
'diaryview' => array('visit','diary','/?uid/?diary_id'),
'picview' => array('album','picview','/?uid/?pic_id'),
);
?>

路由器routing.php:
beta0.1版本的,最新版请直接下载最下面的压缩包
?php
/*
该文件为:路由处理器
程序:MVC框架SEO优化程序 beta.0.1
作者:放弃思考 or j(QQ:376123224)
Blog: http://j.cublog.cn/ Email: huajiehe@yahoo.com.cn
时间:2007-8-23
*/
$server_name = $_SERVER['SERVER_NAME'];
if ( empty( $server_name ) )
    $server_name = getenv( "SERVER_NAME");
$request_uri = $_SERVER['REQUEST_URI'];
if ( empty( $request_uri ) )
    $request_uri = getenv( "REQUEST_URI");
$parameters = str_replace( $_SERVER['SCRIPT_NAME'],'',$request_uri );
$params = explode( '/',$parameters );
if ( empty( $params[0] ) )
{
    array_shift( $params );
}
$is_simple_url = false;
if ( count( $params )>0 && array_key_exists( $params[0],$route_rule) )//简化url模式
{
    $module = $route_rule[$params[0]][0];
    $_GET['module'] = $module;
    $_REQUEST['module'] = $module;
    $is_simple_url = true;
    if ( isSet( $route_rule[$params[0]][2] ) )
    {
        $param_rule = $route_rule[$params[0]][2];
    }else
    {
        $param_rule='*';
    }
   
}else if ( count( $params )>0 && in_array( $params[0],$legal_modules) )//合法的module参数
{
    $module = array_shift( $params );
    $_GET['module'] = $module;
    $_REQUEST['module'] = $module;
}else//没有写module参数的情况
{
    $module = 'default';
    $_GET['module'] = $module;
    $_REQUEST['module'] = $module;
}
if ( count( $params )>0 && array_key_exists( $params[0],$route_rule) )//简化url模式
{
    $action = $route_rule[$params[0]][1];
    $_GET['action'] = $action;
    $_REQUEST['action'] = $action;
    array_shift( $params );
}else if ( count( $params )>0 )
{
    $action = array_shift( $params );
    $action = ($action=='index') ? 'default' :$action;//如果是index,则转化为default。写index会比较友好
    $_GET['action'] = $action;
    $_REQUEST['action'] = $action;
}else//没有action参数了
{
    $action = 'default';
    $_GET['action'] = $action;
    $_REQUEST['action'] = $action;
}
if ( $is_simple_url && $param_rule!=='*')
{
    //echo $param_rule.'
';
    $param_names = explode( '/?',$param_rule );
    array_shift( $param_names );
    if ( count( $param_names ) != count( $params ) )//参数个数不符合规则
    {
        die('url error');
    }
    //根据规则重写参数
    for ( $i = 0; $i  count( $params ); $i=$i+1 )
    {
        $_GET[$param_names[$i]] = $params[$i];
        $_REQUEST[$param_names[$i]] = $params[$i];
    }
}else
{
    for ( $i = 0; $i  count( $params ); $i=$i+2 )
    {
        if ( isSet( $params[$i+1] ) )
        {
            $_GET[$params[$i]] = $params[$i+1];
            $_REQUEST[$params[$i]] = $params[$i+1];
        }    //
    }
}
//如果是规则里面需要简化的url,则简化之
//参数:模块名(含/),页面名(含/),URL参数
function simplifySeoUrl ($module,$action,$parameters)
{
    global $route_rule;
   
    $module = subStr( $module, 1 );
    $action = subStr( $action, 1 );
    //array_shift( $params );
    foreach ( $route_rule as $key => $value )
    {
        if ( $value[0]===$module && $value[1]===$action )
        {
            if ( isSet( $value[2] ) && !empty( $value[2] ) && $value[2]!=='*' )
            {
                $param_rule = $value[2];
            }else//如果没有第三个规则参数,则返回
            {
                return '/'.$key.$parameters;
            }
            $params = explode( '/',$parameters );
            if ( empty( $params[0] ) )
            {
                array_shift( $params );
            }
            
            for ( $i = 0; $i  count( $params ); $i=$i+2 )
            {
                if ( isSet( $params[$i+1] ) )
                {
                    $param_name = $params[$i];
                    $param_value = $params[$i+1];
                    $param_rule = str_replace( '?' . $param_name, urlEncode( $param_value ), $param_rule );
                }
            }
            if ( str_replace( '/?', '', $param_rule) !== $param_rule )
            {
                die('Error: faith'.$module);
            }
            return '/'.$key.$param_rule;
        }
    }
    return '/'.$module.'/'.$action.$parameters;
}
//函数transformLink:将 “一般链接” 转化成 “友好形式”
function transformLink ($url)
{
    global $route_rule;
    $is_simple_mode = false;
    $param_rule = '';
    $url_array = parse_url( $url );
   
    if ( array_key_exists( 'path',$url_array ) && !empty( $url_array['path'] ) )
    {
        $filter_array = array('./','../');//因为是单一入口程序。都是从同一个地方进入
        $path = str_replace( $filter_array, '/', $url_array['path'] );
        //die($path{0});
        //指定web根目录
        if ( $path{0}!=='/' )
        {
            $path = '/'.$path;
        }
    }
    if ( array_key_exists( 'query',$url_array ) && !empty( $url_array['query'] ) )
    {
        $module_value = '/default';//如果没有填写则为default模块
        $action_value = '/index';//如果没有填写则为index页面
        $url_params = explode( '&',$url_array['query'] );
        foreach ( $url_params as $value )
        {
            list( $param_name, $param_value ) = explode( '=',$value );
            //echo $param_name.':'.$param_value.'
';
            
            if ( $param_name == 'module' )
            {
                $module_value = '/'.$param_value;
            }else if ( $param_name == 'action' )
            {
                $action_value = '/'.$param_value;
            }else
            {
                $result = $result.'/'.urlEncode( $param_name ).'/'.urlEncode( $param_value );
            }
        }
        $result = $path.simplifySeoUrl($module_value,$action_value,$result);
        return $result;
    }else
    {
        return $url;
    }
}
?>

实现效果:在模版中现有的链接在调用transformLink()函数处理后,都变成了“友好形式”。
服务器端程序无需进行太大改动,只要在入口处引入两个路由文件即可实现url的全面优化。
同时,一些重要的,特定的页面,还可以通过简单的配置,实现更友好的简化

例如: 只要在配置文件中设定:
$route_rule = array(
'search' => array('public','quickseach','*'),
'diaryview' => array('visit','diary','/?uid/?diary_id'),
'picview' => array('album','picview','/?uid/?pic_id'),
);
将使得:
/search/time/2007/count/100 表示: index.php?module=public&action=quickseach&time=2007&count=100
/diaryview/12/34  表示: ?module=visit&action=diary&uid=12&diary=34
/picview/123/456 表示: ?module=album&action=picview&uid=123&pic_id=456

其他途径:url的优化,还可以通过mod_rewrite来实现。在使用mod_rewrite实现的情况下,你仍然可以调用上面的transformLink()函数,来快速修改你的现有链接。


文件:
SEO优化程序 beta.0.1.rar
大小:
3KB
下载:
下载

文件:
SEO优化程序 beta.0.2.rar
大小:
9KB
下载:
下载


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/12569/showart_365164.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP