- 論壇徽章:
- 0
|
更新日志:
2007-8-29 更新至beta0.2版本
a 增加了去掉index.php的功能(可以開啟或關閉),增加.htaccess配置文件供參考。
b 解決了在去掉“index.php”模式下(apache開啟了RewriteEngine)的,圖片或者css文件的調用出錯問題。
SEO的重要性就不熬訴了,現在的MVC框架一般可以通過路由(route)的配置及遵守其規(guī)則來實現SEO的優(yōu)化(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優(yōu)化程序 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:*號表示規(guī)則
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優(yōu)化程序 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簡化規(guī)則
* 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優(yōu)化程序 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 ) )//參數個數不符合規(guī)則
{
die('url error');
}
//根據規(guī)則重寫參數
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];
} //
}
}
//如果是規(guī)則里面需要簡化的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//如果沒有第三個規(guī)則參數,則返回
{
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的全面優(yōu)化。
同時,一些重要的,特定的頁面,還可以通過簡單的配置,實現更友好的簡化
例如: 只要在配置文件中設定:
$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的優(yōu)化,還可以通過mod_rewrite來實現。在使用mod_rewrite實現的情況下,你仍然可以調用上面的transformLink()函數,來快速修改你的現有鏈接。
![]()
文件:
SEO優(yōu)化程序 beta.0.1.rar
大小:
3KB
下載:
下載
![]()
文件:
SEO優(yōu)化程序 beta.0.2.rar
大小:
9KB
下載:
下載
本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u/12569/showart_365164.html |
|