实现Joomla 的SEF达到SEO的目的

在开发过程中,很多的问题是集成第三方的东西并生成URL。通过分析Joomla站点的URL结果就会发现规律很明显:

域名+index.php?option=com_content&task=category&sectionid=4&id=13&Itemid=27
以上就是一个最普通不过的URL,其中包含的元素有option(组件参数,告诉系统一下内容来自哪个组件)、task(任务参数,组件内执行什么任务上面的例子中代表执行分类列表,sectionid内容的单元号JOOMLA特有,id,itemid项目号)。Joomla本身就自带一个URL优化的组件,也就是一个函数实现对上述地址的重写为index.php/content/view/4/13/27.html 是不是貌似静态,严格来说应该是伪装的静态。

下面的函数实现这个功能

<?php
/**
* @version $Id: sef.php 6022 2006-12-18 22:30:07Z friesengeist $
* @package Joomla
* @copyright Copyright (C) 2005 Open Source Matters. All rights reserved.
* @license http://www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.php
* Joomla! is free software. This version may have been modified pursuant
* to the GNU General Public License, and as distributed it includes or
* is derivative of works licensed under the GNU General Public License or
* other free or open source software licenses.
* See COPYRIGHT.php for copyright notices and details.
*/
 
// no direct access
defined( '_VALID_MOS' ) or die( 'Restricted access' );
/*
if (isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING'])) {
  $_SERVER['REQUEST_URI'] .= $_SERVER['QUERY_STRING'];
}*/
if (isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING'])) {
  $_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME']."?".$_SERVER['QUERY_STRING'];
}
 
if ($mosConfig_sef) {
 $url_array = explode('/', $_SERVER['REQUEST_URI']);
 
 if (in_array('content', $url_array)) {
 
  /**
  * Content
  * http://www.domain.com/$option/$task/$sectionid/$id/$Itemid/$limit/$limitstart
  */
 
  $uri     = explode('content/', $_SERVER['REQUEST_URI']);
  $option    = 'com_content';
  $_GET['option']  = $option;
  $_REQUEST['option'] = $option;
  $pos     = array_search ('content', $url_array);
 
  // language hook for content
  $lang = '';
  foreach($url_array as $key=>$value) {
   if ( !strcasecmp(substr($value,0,5),'lang,') ) {
    $temp = explode(',', $value);
    if (isset($temp[0]) && $temp[0] != '' && isset($temp[1]) && $temp[1] != '') {
     $_GET['lang']   = $temp[1];
     $_REQUEST['lang']  = $temp[1];
     $lang     = $temp[1];
    }
    unset($url_array[$key]);
   }
  }
 
  if (isset($url_array[$pos+8]) && $url_array[$pos+8] != '' && in_array('category', $url_array) && ( strpos( $url_array[$pos+5], 'order,' ) !== false ) && ( strpos( $url_array[$pos+6], 'filter,' ) !== false ) ) {
   // $option/$task/$sectionid/$id/$Itemid/$order/$filter/$limit/$limitstart
   $task      = $url_array[$pos+1];
   $sectionid    = $url_array[$pos+2];
   $id      = $url_array[$pos+3];
   $Itemid     = $url_array[$pos+4];
   $order      = str_replace( 'order,', '', $url_array[$pos+5] );
   $filter     = str_replace( 'filter,', '', $url_array[$pos+6] );
   $limit      = $url_array[$pos+7];
   $limitstart    = $url_array[$pos+8];
 
   // pass data onto global variables
   $_GET['task']    = $task;
   $_REQUEST['task']   = $task;
   $_GET['sectionid']   = $sectionid;
   $_REQUEST['sectionid']  = $sectionid;
   $_GET['id']    = $id;
   $_REQUEST['id']   = $id;
   $_GET['Itemid']   = $Itemid;
   $_REQUEST['Itemid']  = $Itemid;
   $_GET['order']    = $order;
   $_REQUEST['order']   = $order;
   $_GET['filter']   = $filter;
   $_REQUEST['filter']  = $filter;
   $_GET['limit']    = $limit;
   $_REQUEST['limit']   = $limit;
   $_GET['limitstart']  = $limitstart;
   $_REQUEST['limitstart'] = $limitstart;
 
   $QUERY_STRING = "option=com_content&task=$task&sectionid=$sectionid&id=$id&Itemid=$Itemid&order=$order&filter=$filter&limit=$limit&limitstart=$limitstart";
  } else if (isset($url_array[$pos+7]) && $url_array[$pos+7] != '' && $url_array[$pos+5] > 1000 && ( in_array('archivecategory', $url_array) || in_array('archivesection', $url_array) ) ) {
   // $option/$task/$id/$limit/$limitstart/year/month/module
   $task      = $url_array[$pos+1];
   $id      = $url_array[$pos+2];
   $limit      = $url_array[$pos+3];
   $limitstart    = $url_array[$pos+4];
   $year      = $url_array[$pos+5];
   $month      = $url_array[$pos+6];
   $module     = $url_array[$pos+7];
 
   // pass data onto global variables
   $_GET['task']    = $task;
   $_REQUEST['task']   = $task;
   $_GET['id']    = $id;
   $_REQUEST['id']   = $id;
   $_GET['limit']    = $limit;
   $_REQUEST['limit']   = $limit;
   $_GET['limitstart']  = $limitstart;
   $_REQUEST['limitstart'] = $limitstart;
   $_GET['year']    = $year;
   $_REQUEST['year']   = $year;
   $_GET['month']    = $month;
   $_REQUEST['month']   = $month;
   $_GET['module']   = $module;
   $_REQUEST['module']  = $module;
 
   $QUERY_STRING = "option=com_content&task=$task&id=$id&limit=$limit&limitstart=$limitstart&year=$year&month=$month&module=$module";
  } else if (isset($url_array[$pos+7]) && $url_array[$pos+7] != '' && $url_array[$pos+6] > 1000 && ( in_array('archivecategory', $url_array) || in_array('archivesection', $url_array) ) ) {
   // $option/$task/$id/$Itemid/$limit/$limitstart/year/month
   $task      = $url_array[$pos+1];
   $id      = $url_array[$pos+2];
   $Itemid     = $url_array[$pos+3];
   $limit      = $url_array[$pos+4];
   $limitstart    = $url_array[$pos+5];
   $year      = $url_array[$pos+6];
   $month      = $url_array[$pos+7];
 
   // pass data onto global variables
   $_GET['task']    = $task;
   $_REQUEST['task']   = $task;
   $_GET['id']    = $id;
   $_REQUEST['id']   = $id;
   $_GET['Itemid']   = $Itemid;
   $_REQUEST['Itemid']  = $Itemid;
   $_GET['limit']    = $limit;
   $_REQUEST['limit']   = $limit;
   $_GET['limitstart']  = $limitstart;
   $_REQUEST['limitstart'] = $limitstart;
   $_GET['year']    = $year;
   $_REQUEST['year']   = $year;
   $_GET['month']    = $month;
   $_REQUEST['month']   = $month;
 
   $QUERY_STRING = "option=com_content&task=$task&id=$id&Itemid=$Itemid&limit=$limit&limitstart=$limitstart&year=$year&month=$month";
  } else if (isset($url_array[$pos+7]) && $url_array[$pos+7] != '' && in_array('category', $url_array) && ( strpos( $url_array[$pos+5], 'order,' ) !== false )) {
   // $option/$task/$sectionid/$id/$Itemid/$order/$limit/$limitstart
   $task      = $url_array[$pos+1];
   $sectionid    = $url_array[$pos+2];
   $id      = $url_array[$pos+3];
   $Itemid     = $url_array[$pos+4];
   $order      = str_replace( 'order,', '', $url_array[$pos+5] );
   $limit      = $url_array[$pos+6];
   $limitstart    = $url_array[$pos+7];
 
   // pass data onto global variables
   $_GET['task']    = $task;
   $_REQUEST['task']   = $task;
   $_GET['sectionid']   = $sectionid;
   $_REQUEST['sectionid']  = $sectionid;
   $_GET['id']    = $id;
   $_REQUEST['id']   = $id;
   $_GET['Itemid']   = $Itemid;
   $_REQUEST['Itemid']  = $Itemid;
   $_GET['order']    = $order;
   $_REQUEST['order']   = $order;
   $_GET['limit']    = $limit;
   $_REQUEST['limit']   = $limit;
   $_GET['limitstart']  = $limitstart;
   $_REQUEST['limitstart'] = $limitstart;
 
   $QUERY_STRING = "option=com_content&task=$task&sectionid=$sectionid&id=$id&Itemid=$Itemid&order=$order&limit=$limit&limitstart=$limitstart";
  } else if (isset($url_array[$pos+6]) && $url_array[$pos+6] != '') {
  // $option/$task/$sectionid/$id/$Itemid/$limit/$limitstart
   $task      = $url_array[$pos+1];
   $sectionid    = $url_array[$pos+2];
   $id      = $url_array[$pos+3];
   $Itemid     = $url_array[$pos+4];
   $limit      = $url_array[$pos+5];
   $limitstart    = $url_array[$pos+6];
 
   // pass data onto global variables
   $_GET['task']    = $task;
   $_REQUEST['task']   = $task;
   $_GET['sectionid']   = $sectionid;
   $_REQUEST['sectionid']  = $sectionid;
   $_GET['id']    = $id;
   $_REQUEST['id']   = $id;
   $_GET['Itemid']   = $Itemid;
   $_REQUEST['Itemid']  = $Itemid;
   $_GET['limit']    = $limit;
   $_REQUEST['limit']   = $limit;
   $_GET['limitstart']  = $limitstart;
   $_REQUEST['limitstart'] = $limitstart;
 
   $QUERY_STRING = "option=com_content&task=$task&sectionid=$sectionid&id=$id&Itemid=$Itemid&limit=$limit&limitstart=$limitstart";
  } else if (isset($url_array[$pos+5]) && $url_array[$pos+5] != '') {
  // $option/$task/$id/$Itemid/$limit/$limitstart
   $task      = $url_array[$pos+1];
   $id      = $url_array[$pos+2];
   $Itemid     = $url_array[$pos+3];
   $limit      = $url_array[$pos+4];
   $limitstart    = $url_array[$pos+5];
 
   // pass data onto global variables
   $_GET['task']    = $task;
   $_REQUEST['task']   = $task;
   $_GET['id']    = $id;
   $_REQUEST['id']   = $id;
   $_GET['Itemid']   = $Itemid;
   $_REQUEST['Itemid']  = $Itemid;
   $_GET['limit']    = $limit;
   $_REQUEST['limit']   = $limit;
   $_GET['limitstart']  = $limitstart;
   $_REQUEST['limitstart'] = $limitstart;
 
   $QUERY_STRING = "option=com_content&task=$task&id=$id&Itemid=$Itemid&limit=$limit&limitstart=$limitstart";
  } else if (isset($url_array[$pos+4]) && $url_array[$pos+4] != '' && ( in_array('archivecategory', $url_array) || in_array('archivesection', $url_array) )) {
  // $option/$task/$year/$month/$module
   $task      = $url_array[$pos+1];
   $year      = $url_array[$pos+2];
   $month      = $url_array[$pos+3];
   $module     = $url_array[$pos+4];
 
   // pass data onto global variables
   $_GET['task']    = $task;
   $_REQUEST['task']   = $task;
   $_GET['year']    = $year;
   $_REQUEST['year']   = $year;
   $_GET['month']    = $month;
   $_REQUEST['month']   = $month;
   $_GET['module']   = $module;
   $_REQUEST['module']  = $module;
 
   $QUERY_STRING = "option=com_content&task=$task&year=$year&month=$month&module=$module";
  } else if (!(isset($url_array[$pos+5]) && $url_array[$pos+5] != '') && isset($url_array[$pos+4]) && $url_array[$pos+4] != '') {
  // $option/$task/$sectionid/$id/$Itemid
   $task      = $url_array[$pos+1];
   $sectionid     = $url_array[$pos+2];
   $id      = $url_array[$pos+3];
   $Itemid     = $url_array[$pos+4];
 
   // pass data onto global variables
   $_GET['task']    = $task;
   $_REQUEST['task']   = $task;
   $_GET['sectionid']   = $sectionid;
   $_REQUEST['sectionid']  = $sectionid;
   $_GET['id']    = $id;
   $_REQUEST['id']   = $id;
   $_GET['Itemid']   = $Itemid;
   $_REQUEST['Itemid']  = $Itemid;
 
   $QUERY_STRING = "option=com_content&task=$task&sectionid=$sectionid&id=$id&Itemid=$Itemid";
  } else if (!(isset($url_array[$pos+4]) && $url_array[$pos+4] != '') && (isset($url_array[$pos+3]) && $url_array[$pos+3] != '')) {
  // $option/$task/$id/$Itemid
   $task      = $url_array[$pos+1];
   $id      = $url_array[$pos+2];
   $Itemid     = $url_array[$pos+3];
 
   // pass data onto global variables
   $_GET['task']    = $task;
   $_REQUEST['task']   = $task;
   $_GET['id']    = $id;
   $_REQUEST['id']   = $id;
   $_GET['Itemid']   = $Itemid;
   $_REQUEST['Itemid']  = $Itemid;
 
   $QUERY_STRING = "option=com_content&task=$task&id=$id&Itemid=$Itemid";
  } else if (!(isset($url_array[$pos+3]) && $url_array[$pos+3] != '') && (isset($url_array[$pos+2]) && $url_array[$pos+2] != '')) {
  // $option/$task/$id
   $task      = $url_array[$pos+1];
   $id      = $url_array[$pos+2];
 
   // pass data onto global variables
   $_GET['task']    = $task;
   $_REQUEST['task']   = $task;
   $_GET['id']    = $id;
   $_REQUEST['id']   = $id;
 
   $QUERY_STRING = "option=com_content&task=$task&id=$id";
  } else if (!(isset($url_array[$pos+2]) && $url_array[$pos+2] != '') && (isset($url_array[$pos+1]) && $url_array[$pos+1] != '')) {
  // $option/$task
   $task = $url_array[$pos+1];
 
   $_GET['task']    = $task;
   $_REQUEST['task']   = $task;
 
   $QUERY_STRING = 'option=com_content&task='. $task;
  }
 
  if ($lang!='') {
   $QUERY_STRING .= '&amp;lang='. $lang;
  }
 
  $_SERVER['QUERY_STRING']  = $QUERY_STRING;
  $REQUEST_URI     = $uri[0].'index.php?'.$QUERY_STRING;
  $_SERVER['REQUEST_URI']  = $REQUEST_URI;
 
 } else if (in_array('component', $url_array)) {
 
  /*
  Components
  http://www.domain.com/component/$name,$value
  */
  $uri = explode('component/', $_SERVER['REQUEST_URI']);
  $uri_array = explode('/', $uri[1]);
  $QUERY_STRING = '';
 
  // needed for check if component exists
  $path   = $mosConfig_absolute_path .'/components';
  $dirlist  = array();
  if ( is_dir( $path ) ) {
   $base = opendir( $path );
   while (false !== ( $dir = readdir($base) ) ) {
    if ($dir !== '.' && $dir !== '..' && is_dir($path .'/'. $dir) && strtolower($dir) !== 'cvs' && strtolower($dir) !== '.svn') {
     $dirlist[] = $dir;
    }
   }
   closedir($base);
  }
 
  foreach($uri_array as $value) {
   $temp = explode(',', $value);
   if (isset($temp[0]) && $temp[0]!='' && isset($temp[1]) && $temp[1]!='') {
    $_GET[$temp[0]]  = $temp[1];
    $_REQUEST[$temp[0]] = $temp[1];
 
    // check to ensure component actually exists
    if ( $temp[0] == 'option' ) {
     $check = '';
     if (count( $dirlist )) {
      foreach ( $dirlist as $dir ) {
       if ( $temp[1] == $dir ) {
        $check = 1;
        break;
       }
      }
     }
     // redirect to 404 page if no component found to match url
     if ( !$check ) {
      header( 'HTTP/1.0 404 Not Found' );
      require_once( $mosConfig_absolute_path . '/templates/404.php' );
      exit( 404 );
     }
    }
 
    if ( $QUERY_STRING == '' ) {
     $QUERY_STRING .= "$temp[0]=$temp[1]";
    } else {
     $QUERY_STRING .= "&$temp[0]=$temp[1]";
    }
   }
  }
 
  $_SERVER['QUERY_STRING']  = $QUERY_STRING;
  $REQUEST_URI     = $uri[0].'index.php?'.$QUERY_STRING;
  $_SERVER['REQUEST_URI']  = $REQUEST_URI;
 
  if (defined('RG_EMULATION') && RG_EMULATION == 1) {
   // Extract to globals
   while(list($key,$value)=each($_GET)) {
    if ($key!="GLOBALS") {
     $GLOBALS[$key]=$value;
    }
   }
   // Don't allow config vars to be passed as global
   include( 'configuration.php' );
 
   // SSL check - $http_host returns <live site url>:<port number if it is 443>
   $http_host = explode(':', $_SERVER['HTTP_HOST'] );
   if( (!empty( $_SERVER['HTTPS'] ) && strtolower( $_SERVER['HTTPS'] ) != 'off' || isset( $http_host[1] ) && $http_host[1] == 443) && substr( $mosConfig_live_site, 0, 8 ) != 'https://' ) {
    $mosConfig_live_site = 'https://'.substr( $mosConfig_live_site, 7 );
   }
  }
 
 } else {
 
  /*
  Unknown content
  http://www.domain.com/unknown
  */
  $jdir = str_replace( 'index.php', '', $_SERVER['PHP_SELF'] );
  $juri = str_replace( $jdir, '', $_SERVER['REQUEST_URI'] );
 
  if ($juri != '' && $juri != '/' && !eregi( "index\.php", $_SERVER['REQUEST_URI'] ) && !eregi( "index2\.php", $_SERVER['REQUEST_URI'] ) && !eregi( "/\?", $_SERVER['REQUEST_URI'] ) && $_SERVER['QUERY_STRING'] == '' ) {
   header( 'HTTP/1.0 404 Not Found' );
   require_once( $mosConfig_absolute_path . '/templates/404.php' );
   exit( 404 );
  }
 }
}
 
function sefRelToAbs2( $string, &$parts, $fragment){
 global $mosConfig_live_site;
 $sefstring=$string;
 
 //从数组中将itemid删除
 $parts = array_change_key_case($parts);
 unset($parts['itemid']);
 
 error_reporting(E_ALL);
 switch ($parts['option']){
 
 case 'com_content':
 case 'content':
  //index.php?option=com_content&task=view&id=396&Itemid=157
  if($parts['task']=='view' && count($parts)==3){
   $sefstring = "content_".$parts['id'];
  }
  //index.php?option=com_content&task=category&id=150&Itemid=157
  //index.php?option=com_content&task=category&sectionid=29&id=150&Itemid=157
  //index.php?option=com_content&task=category&sectionid=29&id=148&Itemid=157&limit=50&limitstart=50
  elseif($parts['task']=='category'){
   if($parts['limit']>0 && count($parts)==5){
    $sefstring = "content_s_".$parts['sectionid'].'_c_'.$parts['id'].'_l_'. $parts['limit'] .'_ls_'.$parts['limitstart'];
   }elseif(count($parts)==4){
    $sefstring = "content_s_".$parts['sectionid'].'_c_'.$parts['id'];
   }
  }
  //index.php?option=com_content&task=section&Itemid=157&id=$1 [NC,L]   #单元
  elseif($parts['task']=='section' && count($parts)==3){
   $sefstring = "content_s_".$parts['id'];
  }
  else{
   return $string;
  };
  break;
 
 case 'com_seyret':
 case 'seyret':
  //index.php?option=com_seyret&Itemid=145
  if(count($parts)==1){
   $sefstring='video';
  }
  elseif(count($parts)==3 && $parts['task']=='videodirectlink' && array_key_exists('id',$parts)){
   $sefstring='video_'.$parts['id'];
  }
  elseif(count($parts)==2 && array_key_exists('catid',$parts)){
   $sefstring='video_cat_'.$parts['catid'];
  }
  elseif(count($parts)==5 && array_key_exists('catid',$parts) && $parts['task']=='videocatlist' && array_key_exists('act',$parts) &&  array_key_exists('navstart',$parts)){
   $sefstring='video_cat_'.$parts['catid'].'_'.$parts['navstart'].'_'.$parts['act'];
  }
  elseif(count($parts)==2 && $parts['task']=='addlinkfront'){
   $sefstring='video_addlinkfront';
  }
  elseif(count($parts)==2 && $parts['task']=='seyrethelp'){
   $sefstring='video_help';
  }
  elseif(count($parts)==2 && $parts['task']=='featuredvideos'){
   $sefstring='video_featured';
  }
  elseif(count($parts)==3 && $parts['task']=='featuredvideos' && array_key_exists('from',$parts)){
   $sefstring='video_featured_'.$parts['from'];
  }
  elseif(count($parts)==2 && $parts['task']=='allvideoslist'){
   $sefstring='video_list';
  }
  elseif(count($parts)==3 && $parts['task']=='allvideoslist' && array_key_exists('from',$parts)){
   $sefstring='video_list_'.$parts['from'];
  }
  //index.php?option=com_seyret&Itemid=145&latestnavstart=$1
  //index.php?option=com_seyret&Itemid=145&latestnavstart=$1
  //index.php?option=com_seyret&Itemid=145&latestnavstart=$1
  //index.php?option=com_seyret&Itemid=145&latestnavstart=$1
  elseif(count($parts)==2 && array_key_exists('latestnavstart',$parts)){
   $sefstring='video_latestnavstart_'.$parts['latestnavstart'];
  }
  elseif(count($parts)==2 && array_key_exists('mostviewednavstart',$parts)){
   $sefstring='video_mostviewednavstart_'.$parts['mostviewednavstart'];
  }
  elseif(count($parts)==2 && array_key_exists('highestratednavstart',$parts)){
   $sefstring='video_highestratednavstart_'.$parts['highestratednavstart'];
  }
  elseif(count($parts)==2 && array_key_exists('featurednavstart',$parts)){
   $sefstring='video_featurednavstart_'.$parts['featurednavstart'];
  }
  elseif(count($parts)==3 && $parts['task']=='searchvideos' && array_key_exists('searchkey',$parts)){
   $sefstring='video_search_'.$parts['searchkey'];
  }
  break;
 
 case 'com_ponygallery';
 case 'ponygallery';
  //index.php?option=com_ponygallery&Itemid=151
  if(count($parts)==1){
   $sefstring='picture';
  }
  elseif(count($parts)==2 && array_key_exists('startpage',$parts)){
   $sefstring='picture';
  }
  elseif(count($parts)==3 && $parts['func']=='viewcategory' && array_key_exists('catid',$parts)){
   $sefstring='picture_c_'.$parts['catid'];
  }
  elseif(count($parts)==4 && $parts['func']=='viewcategory' && array_key_exists('catid',$parts) && array_key_exists('startpage',$parts)){
   $sefstring='picture_c_'.$parts['catid']."_".$parts['startpage'];
  }
  elseif(count($parts)==3 && $parts['func']=='detail' && array_key_exists('id',$parts)){
   $sefstring='picture_'.$parts['id'];
  }
  elseif(count($parts)==3 && $parts['func']=='watermark' && array_key_exists('id',$parts)){
   $sefstring='picture_watermark_'.$parts['id'];
  }
  elseif(count($parts)==4 && $parts['func']=='special' && array_key_exists('sorting',$parts) && array_key_exists('sstring',$parts)){
   $sefstring='picture_search_'.$parts['sstring'];
  }
  elseif(count($parts)==3 && $parts['func']=='special' && array_key_exists('sorting',$parts)){
   $sefstring='picture_special_'.$parts['sorting'];
  }
  elseif(count($parts)==2 && $parts['func']=='special'){
   $sefstring='picture_special';
  }
  elseif(count($parts)==2 && $parts['func']=='userpannel'){
   $sefstring='picture_userpanel';
  }
  //index.php?option=com_ponygallery&func=showupload&Itemid=151
  elseif(count($parts)==2 && $parts['func']=='showupload'){
   $sefstring='picture_showupload';
  }
  break;
 
 case 'com_remository':
 case 'remository':
  //index.php?option=com_remository&Itemid=150
  if(count($parts)==1){
   $sefstring='file';
  }
  elseif(count($parts)==2 && $parts['func']=='addfile'){
   $sefstring='file_addfile';
  }
  elseif(count($parts)==3 && $parts['func']=='addfile' && array_key_exists('id',$parts)){
   $sefstring='file_addfile_'.$parts['id'];
  }
  elseif(count($parts)==2 && $parts['func']=='addmanyfiles'){
   $sefstring='file_addmanyfiles';
  }
  //index.php?option=com_remository&Itemid=150&func=select&id=$1
  elseif(count($parts)==3 && $parts['func']=='select' && array_key_exists('id',$parts)){
   $sefstring='file_c_'.$parts['id'];
  }
  //index.php?option=com_remository&Itemid=150&func=select&id=4&orderby=1
  elseif(count($parts)==4 && $parts['func']=='select' && array_key_exists('id',$parts) && array_key_exists('orderby',$parts)){
   $sefstring='file_c_'.$parts['id']."_".$parts['orderby'];
  }
  //index.php?option=com_remository&Itemid=150&func=select&id=4&orderby=1&page=2
  elseif(count($parts)==5 && $parts['func']=='select' && array_key_exists('id',$parts) && array_key_exists('orderby',$parts) && array_key_exists('page',$parts)){
   $sefstring='file_c_'.$parts['id']."_".$parts['orderby']."_".$parts['page'];
  }
  //index.php?option=com_remository&Itemid=150&func=fileinfo&id=$1
  elseif(count($parts)==3 && $parts['func']=='fileinfo' && array_key_exists('id',$parts)){
   $sefstring='file_'.$parts['id'];
  }
  //index.php?option=com_remository&Itemid=150&func=thumbupdate&id=377
  elseif(count($parts)==3 && $parts['func']=='thumbupdate' && array_key_exists('id',$parts)){
   $sefstring='file_thumbupdate_'.$parts['id'];
  }
  //index.php?option=com_remository&Itemid=150&func=userupdate&id=377
  elseif(count($parts)==3 && $parts['func']=='userupdate' && array_key_exists('id',$parts)){
   $sefstring='file_userupdate_'.$parts['id'];
  }
  //index.php?option=com_remository&Itemid=150&func=startdown&id=377
  elseif(count($parts)==3 && $parts['func']=='startdown' && array_key_exists('id',$parts)){
   $sefstring='file_startdown_'.$parts['id'];
  }
  elseif(count($parts)==3 && $parts['func']=='finishdown' && array_key_exists('id',$parts)){
   $sefstring='file_finishdown_'.$parts['id'];
  }
  //index.php?option=com_remository&Itemid=150&func=download&id=377&chk=fce8c5ff58df08f0ae204deea4756ee2&no_html=1
  elseif(count($parts)==5 && $parts['func']=='download' && array_key_exists('id',$parts) && array_key_exists('chk',$parts) && array_key_exists('no_html',$parts)){
   $sefstring='file_download_'.$parts['id'].'_'.$parts['chk'].'_'.$parts['no_html'];
  }
 
  //index.php?option=com_remository&Itemid=150&func=search
  elseif(count($parts)==2 && $parts['func']=='search'){
   $sefstring='file_search';
  }
  //index.php?option=com_remository&Itemid=150&func=search&search_text=$1&search_filetitle=1&submit=submit
  elseif(count($parts)==5 && $parts['func']=='search' && array_key_exists('search_text',$parts)){
   $sefstring='file_search_'.$parts['search_text'];
  }
  elseif(count($parts)==6 && $parts['func']=='search' && array_key_exists('search_text',$parts) && array_key_exists('search_filetitle',$parts) && array_key_exists('search_filedescription',$parts)){
   $sefstring='file_search_'.$parts['search_text'];
  }
  break;
 
 case 'com_frontpage':
 case 'frontpage':
  $sefstring = '';
  break;
 
 case 'com_comprofiler':
 if(count($parts)==2 && $parts['task']=='registers'){
   $sefstring='register';
  }
  break;
 
 case 'com_search':
  //echo "======|";
  //index.php?option=com_search&Itemid=99999999&searchword=$1&searchphrase=any&ordering=newest&limit=$2&limitstart=$3
  if(array_key_exists('limit',$parts)){
   $sefstring='search_'.$parts['searchword'].'_'.$parts['limit'].'_'.$parts['limitstart'];
   //echo $sefstring;
  }else{
   $sefstring='search_'.$parts['searchword'];
  }
  break;
 }
 
 if($sefstring!=$string){
  return $mosConfig_live_site .'/'. $sefstring . $fragment;
 }else
  return $mosConfig_live_site .'/'. $string;
}
 
 
/**
 * Converts an absolute URL to SEF format
 * @param string The URL
 * @return string
 */
function sefRelToAbs( $string ) {
 global $mosConfig_live_site, $mosConfig_sef, $mosConfig_multilingual_support;
 global $iso_client_lang;
 
 //multilingual code url support
 if( $mosConfig_sef && $mosConfig_multilingual_support && $string!='index.php' && !eregi("^(([^:/?#]+):)",$string) && !strcasecmp(substr($string,0,9),'index.php') && !eregi('lang=', $string) ) {
  $string .= '&amp;lang='. $iso_client_lang;
 }
 
 // SEF URL Handling
 if ($mosConfig_sef && !eregi("^(([^:/?#]+):)",$string) && !strcasecmp(substr($string,0,9),'index.php')) {
  // Replace all &amp; with &
  $string = str_replace( '&amp;', '&', $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( '+', '%2b', $url['query'] ) );
   // clean possible xss attacks
   $url['query'] = preg_replace( "'%3Cscript[^%3E]*%3E.*?%3C/script%3E'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( '%2b', '+', $value ) );
    }
   }
   //var_dump($parts);
   $sefstring = '';
 
   // added by afo...
   if ( isset($parts['option']) && ( $parts['option'] == 'com_comprofiler' || $parts['option'] == 'rontpage' || $parts['option'] == 'com_frontpage' || $parts['option'] == 'com_search' || $parts['option'] == 'com_content' || $parts['option'] == 'content' || $parts['option'] == 'com_seyret' || $parts['option'] == 'com_ponygallery' || $parts['option'] == 'com_remository') ) {
    //echo "aa======|$string";
    return sefRelToAbs2( $string, $parts, $fragment);
   }
 
   // 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] [&sectionid=$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 );
    }
   }
  // no query given. Empty $string to get only the fragment
  // index.php#anchor or index.php?#anchor
  } else {
   $string = '';
  }
 
  // 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;
 }
}
?>

 你可以设置

    $mosConfig_sef=1;
    $mosConfig_multilingual_support=1;
    $iso_client_lang='cn';

进行测试生成

/content/category/4/13/27/lang,cn/

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值