Joomla是目前比较盛行的CMS系统,良好的框架结构使越来越多的开发人员加入进来。使用Joomla有一段时间的人都知道Joomla所生成的站点一般都是基于动态URL的对于搜索引擎来说动态URL的站点并不是就不能搜索到就一定会排在后面而是不太友好,这个不友好也是暂时的目前的个别现象,事物都是进步的GOOGLE也会在不断进步,其实我并不喜欢那些把搜索引擎吹呼的不得了的人,这个优化大师那个优化姥姥的,那些人八成都是有一点点个人的私欲在里面,要是不小心刺激到你,抱歉我不是有意在说你!Joomla中的SEF说白了就是一个对URL的重写的过程将原来参数众多,层次很深的URL改写为一个简单的更容易被记住被搜索的URL。通过分析Joomla站点的URL结果就会发现规律很明显: 域名+index.php?option=com_content&task=category§ionid=4&id=13&Itemid=27以上就是一个最普通不过的URL,其中包含的元素有option(组件参数,告诉系统一下内容来自哪个组件)、task(任务参数,组件内执行什么任务上面的例子中代表执行分类列表,sectionid内容的单元号JOOMLA特有,id,itemid项目号)。Joomla本身就自带一个URL优化的组件,也就是一个函数实现对上述地址的重写为index.php/content/view/4/13/27.html,是不是貌似静态,严格来说应该是伪装的静态。下面的函数sefRelToAbs就是实现上述改写的
/* * * Converts an absolute URL to SEF format * @param string The URL * @return string */ function sefRelToAbs( $string ) { global $mosConfig_live_site , $mosConfig_sef , $mosConfig_mbf_content , $mosConfig_multilingual_support ; global $iso_client_lang ; // multilingual code url support if ( $mosConfig_sef && ( $mosConfig_mbf_content || $mosConfig_multilingual_support ) && $string != ' index.php ' && ! eregi ( " ^(([^:/?#]+):) " , $string ) && ! strcasecmp ( substr ( $string , 0 , 9 ) , ' index.php ' ) && ! eregi ( ' lang= ' , $string ) ) { $string .= ' &lang= ' . $iso_client_lang ; } // SEF URL Handling if ( $mosConfig_sef && ! eregi ( " ^(([^:/?#]+):) " , $string ) && ! strcasecmp ( substr ( $string , 0 , 9 ) , ' index.php ' )) { // Replace all & with & $string = str_replace ( ' & ' , ' & ' , $string ); // Home index.php if ( $string == ' index.php ' ) { $string = '' ; } // break link into url component parts $url = parse_url ( $string ); // check if link contained fragment identifiers (ex. #foo) $fragment = '' ; if ( isset ( $url [ ' fragment ' ]) ) { // ensure fragment identifiers are compatible with HTML4 if ( preg_match ( ' @^[A-Za-z][A-Za-z0-9:_.-]*$@ ' , $url [ ' fragment ' ])) { $fragment = ' # ' . $url [ ' fragment ' ]; } } // check if link contained a query component if ( isset ( $url [ ' query ' ]) ) { // special handling for javascript $url [ ' query ' ] = stripslashes ( str_replace ( ' + ' , ' + ' , $url [ ' query ' ] ) ); // clean possible xss attacks $url [ ' query ' ] = preg_replace ( " ''si " , '' , $url [ ' query ' ] ); // break url into component parts parse_str ( $url [ ' query ' ] , $parts ); // special handling for javascript foreach ( $parts as $key => $value ) { if ( strpos ( $value , ' + ' ) !== false ) { $parts [ $key ] = stripslashes ( str_replace ( ' + ' , ' + ' , $value ) ); } } // var_dump($parts); $sefstring = '' ; // Component com_content urls if ( ( ( isset ( $parts [ ' option ' ]) && ( $parts [ ' option ' ] == ' com_content ' || $parts [ ' option ' ] == ' content ' ) ) ) && ( $parts [ ' task ' ] != ' new ' ) && ( $parts [ ' task ' ] != ' edit ' ) ) { // index.php?option=com_content [&task=$task] [§ionid=$sectionid] [&id=$id] [&Itemid=$Itemid] [&limit=$limit] [&limitstart=$limitstart] [&year=$year] [&month=$month] [&module=$module] $sefstring .= ' content/ ' ; // task if ( isset ( $parts [ ' task ' ] ) ) { $sefstring .= $parts [ ' task ' ] . ' / ' ; } // sectionid if ( isset ( $parts [ ' sectionid ' ] ) ) { $sefstring .= $parts [ ' sectionid ' ] . ' / ' ; } // id if ( isset ( $parts [ ' id ' ] ) ) { $sefstring .= $parts [ ' id ' ] . ' / ' ; } // Itemid if ( isset ( $parts [ ' Itemid ' ] ) ) { // only add Itemid value if it does not correspond with the 'unassigned' Itemid value if ( $parts [ ' Itemid ' ] != 99999999 && $parts [ ' Itemid ' ] != 0 ) { $sefstring .= $parts [ ' Itemid ' ] . ' / ' ; } } // order if ( isset ( $parts [ ' order ' ] ) ) { $sefstring .= ' order, ' . $parts [ ' order ' ] . ' / ' ; } // filter if ( isset ( $parts [ ' filter ' ] ) ) { $sefstring .= ' filter, ' . $parts [ ' filter ' ] . ' / ' ; } // limit if ( isset ( $parts [ ' limit ' ] ) ) { $sefstring .= $parts [ ' limit ' ] . ' / ' ; } // limitstart if ( isset ( $parts [ ' limitstart ' ] ) ) { $sefstring .= $parts [ ' limitstart ' ] . ' / ' ; } // year if ( isset ( $parts [ ' year ' ] ) ) { $sefstring .= $parts [ ' year ' ] . ' / ' ; } // month if ( isset ( $parts [ ' month ' ] ) ) { $sefstring .= $parts [ ' month ' ] . ' / ' ; } // module if ( isset ( $parts [ ' module ' ] ) ) { $sefstring .= $parts [ ' module ' ] . ' / ' ; } // lang if ( isset ( $parts [ ' lang ' ] ) ) { $sefstring .= ' lang, ' . $parts [ ' lang ' ] . ' / ' ; } $string = $sefstring ; // all other components // index.php?option=com_xxxx &... } else if ( isset ( $parts [ ' option ' ]) && ( strpos ( $parts [ ' option ' ] , ' com_ ' ) !== false ) ) { // do not SEF where com_content - `edit` or `new` task link if ( ! ( ( $parts [ ' option ' ] == ' com_content ' ) && ( ( isset ( $parts [ ' task ' ]) == ' new ' ) || ( isset ( $parts [ ' task ' ]) == ' edit ' ) ) ) ) { $sefstring = ' component/ ' ; foreach ( $parts as $key => $value ) { // remove slashes automatically added by parse_str $value = stripslashes ( $value ); $sefstring .= $key . ' , ' . $value . ' / ' ; } $string = str_replace ( ' = ' , ' , ' , $sefstring ); } } } // allows SEF without mod_rewrite // comment line below if you dont have mod_rewrite return $mosConfig_live_site . ' / ' . $string . $fragment ; // allows SEF without mod_rewrite // uncomment Line 512 and comment out Line 514 // uncomment line below if you dont have mod_rewrite // return $mosConfig_live_site .'/index.php/'. $string . $fragment; // If the above doesnt work - try uncommenting this line instead // return $mosConfig_live_site .'/index.php?/'. $string . $fragment; } else { // Handling for when SEF is not activated // Relative link handling if ( ( strpos ( $string , $mosConfig_live_site ) !== 0 ) ) { // if URI starts with a "/", means URL is at the root of the host... if ( strncmp ( $string , ' / ' , 1 ) == 0 ) { // splits http(s)://xx.xx/yy/zz..." into [1]="http(s)://xx.xx" and [2]="/yy/zz...": $live_site_parts = array (); eregi ( " ^(https?:[/]+[^/]+)(.*$) " , $mosConfig_live_site , $live_site_parts ); $string = $live_site_parts [ 1 ] . $string ; } else { $check = 1 ; // array list of non http/https URL schemes $url_schemes = explode ( ' , ' , _URL_SCHEMES ); $url_schemes [] = ' http: ' ; $url_schemes [] = ' https: ' ; foreach ( $url_schemes as $url ) { if ( strpos ( $string , $url ) === 0 ) { $check = 0 ; } } if ( $check ) { $string = $mosConfig_live_site . ' / ' . $string ; } } } return $string ; }} 要想使用这个函数首先要确定你的服务器是否支持URL重写,一般来说只有APACHE服务器支持,IIS就不要打算了。