- 论坛徽章:
- 0
|
更新日志:
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 |
|