public static function updateShurls() { $pageInfo =& Sh404sefFactory::getPageInfo(); $sefConfig =& Sh404sefFactory::getConfig(); $pageInfo->shURL = empty($pageInfo->shURL) ? '' : $pageInfo->shURL; if ($sefConfig->enablePageId && !$sefConfig->stopCreatingShurls) { try { jimport('joomla.utilities.string'); $nonSefUrl = JString::ltrim($pageInfo->currentNonSefUrl, '/'); $nonSefUrl = shSortURL($nonSefUrl); // make sure we have a language $nonSefUrl = shSetURLVar($nonSefUrl, 'lang', $pageInfo->currentLanguageShortTag); // remove tracking vars (Google Analytics) $nonSefUrl = Sh404sefHelperGeneral::stripTrackingVarsFromNonSef($nonSefUrl); // try to get the current shURL, if any $shURL = ShlDbHelper::selectResult('#__sh404sef_pageids', array('pageid'), array('newurl' => $nonSefUrl)); // if none, we may have to create one if (empty($shURL)) { $shURL = self::_createShurl($nonSefUrl); } // insert in head and header, if not empty if (!empty($shURL)) { $fullShURL = JString::ltrim($pageInfo->getDefaultFrontLiveSite(), '/') . '/' . $shURL; $document = JFactory::getDocument(); if ($sefConfig->insertShortlinkTag) { $document->addHeadLink($fullShURL, 'shortlink'); // also add header, especially for HEAD requests JResponse::setHeader('Link', '<' . $fullShURL . '>; rel=shortlink', true); } if ($sefConfig->insertRevCanTag) { $document->addHeadLink($fullShURL, 'canonical', 'rev', array('type' => 'text/html')); } if ($sefConfig->insertAltShorterTag) { $document->addHeadLink($fullShURL, 'alternate shorter'); } // store for reuse $pageInfo->shURL = $shURL; } } catch (Exception $e) { ShlSystem_Log::error('sh404sef', '%s::%s::%d: %s', __CLASS__, __METHOD__, __LINE__, $e->getMessage()); } } }
function revert(&$url_array, $pos) { $sefConfig =& shRouter::shGetConfig(); // get DB $database =& JFactory::getDBO(); $QUERY_STRING = ''; $req = implode('/', $url_array); if ($req != '/') { $req = JString::ltrim($req, '/'); } // V x $req = str_replace("//", "/", $req); _log('sef404 reverting URL : ' . $req); // read from db $sql = "SELECT oldurl, newurl FROM #__redirection WHERE oldurl = " . $database->Quote($req) . " ORDER BY rank ASC LIMIT 1"; // V 1.2.4.q $database->setQuery($sql); $row = $database->loadObject(); if ($row) { // use the cached url $string = $row->newurl; // check for urls using wrong letter case, 301 redirect to correct url case $shPageInfo =& shRouter::shPageInfo(); if (empty($shPageInfo->autoRedirectsDisabled) && $sefConfig->redirectToCorrectCaseUrl) { // if initial query exactly matches oldurl found in db, then case is correct // else we redirect to the url found in db, but we also need to append query string to it ! if ($req != $row->oldurl) { // can only be different from case // what is the url we should redirect to ? $targetUrl = str_replace($req, $row->oldurl, $shPageInfo->shSaveRequestURI); $targetUrl = $shPageInfo->URI->protocol . '://' . $shPageInfo->URI->host . (!sh404SEF_USE_NON_STANDARD_PORT || empty($shPageInfo->URI->port) ? '' : ':' . $shPageInfo->URI->port) . $targetUrl . (empty($shPageInfo->URI->anchor) ? '' : '#' . $shPageInfo->URI->anchor); // perform redirect _log('Redirecting to correct url case : from ' . $req . ' to ' . $targetUrl); shRedirect($targetUrl); } } // keep going if we did not redirect to correct case _log('sef404 reverting URL : found : ' . $row->newurl); // update the count $database->setQuery("UPDATE #__redirection SET cpt=(cpt+1) WHERE `newurl` = " . $database->Quote($row->newurl) . " AND `oldurl` = " . $database->Quote($row->oldurl)); // V 1.2.4.q $database->query(); // now we must merge query string from request and POST data with that found in db // as there might be common variables. For instance, limit=5 in the DB // but limit=10 as been pass as POST DATA from a drop-down list item $otherVars = empty($shPageInfo->URI->querystring) ? array() : $shPageInfo->URI->querystring; $postVars = JRequest::get('post'); $otherVars = array_merge($otherVars, $postVars); if (!empty($otherVars)) { foreach ($otherVars as $key => $value) { // if var exists in the incoming url, override it with querystring or post var value if (shGetURLVar($string, $key, null) !== null) { // if we change the value of limit, we must reset limitstart, or we may end up // with weird page number if ($key == 'limit') { $limit = shGetURLVar($string, 'limit', null); if (!is_null($limit) && $value != $limit) { // we are changing limit value : is there a limitstart ? $limitstart = shGetURLVar($string, 'limitstart', null); if (!is_null($limitstart)) { // calculate a new limitstart $limitstart = empty($limit) ? 0 : floor($limitstart / $limit) - 1; $limitstart = $limitstart < 0 ? 0 : $limitstart; // and set it $string = shSetURLVar($string, 'limitstart', $limitstart, $canBeEmpty = true); // kill any remaining limitstart value if (array_key_exists('limitstart', $otherVars)) { unset($otherVars['limitstart']); } } } } // now apply new value for the key $string = shSetURLVar($string, $key, $value); } } } $string = str_replace('&', '&', $string); $QUERY_STRING = str_replace('index.php?', '', $string); // so weird : because of how Joomla choose to not include $limit in urls, I must remove &limit=xx from the restored url // I do have to store it in db however, otherwise same sef will be associated with same non-sef, and then // Joomla content views will be screwed up also as they guess $limit and reset JRequest('limit'); if (!empty($QUERY_STRING)) { $QUERY_STRING = '&' . $QUERY_STRING; $option = shGetURLVar($QUERY_STRING, 'option'); $layout = shGetURLVar($QUERY_STRING, 'layout'); if (empty($layout)) { $layout = 'default'; } $view = shGetURLVar($QUERY_STRING, 'view'); if ($option == 'com_content' && $layout != 'blog' && ($view == 'category' || $view == 'section')) { $limit = shGetURLVar($QUERY_STRING, 'limit'); //$QUERY_STRING = shCleanUpVar( $QUERY_STRING, 'limit'); // but we need to keep it, because of a bug in Joomla, which I could not trace // whereby the user state limit value in com_content.default.limit is that of the blog instead of that of the current view global $mainframe; $mainframe->setUserState('com_content.sh.' . $view . '.' . $layout . '.limit', $limit); //_log( 'Removing limit from reverted url, to : ' . $QUERY_STRING); } $QUERY_STRING = JString::ltrim($QUERY_STRING, '&'); } } return $QUERY_STRING; }
function shSefRelToAbs($string, $shLanguageParam, &$uri, &$originalUri) { global $_SEF_SPACE, $shMosConfig_lang, $shMosConfig_locale, $mainframe, $shGETVars, $shRebuildNonSef, $shHomeLink; _log('Entering shSefRelToAbs with ' . $string . ' | Lang = ' . $shLanguageParam); // if superadmin, display non-sef URL, for testing/setting up purposes if (sh404SEF_NON_SEF_IF_SUPERADMIN) { $user = JFactory::getUser(); if ($user->usertype == 'Super Administrator') { _log('Returning non-sef because superadmin said so.'); return 'index.php'; } } // return unmodified anchors if (JString::substr($string, 0, 1) == '#') { // V 1.2.4.t return $string; } $sefConfig =& shRouter::shGetConfig(); $shPageInfo =& shRouter::shPageInfo(); // Quick fix for shared SSL server : if https, switch to non sef $id = shGetURLVar($string, 'Itemid', JRequest::getInt('Itemid')); $secure = !empty($shPageInfo->shHttpsSave) || 'yes' == shGetMenuItemSsl($id); if ($secure && $sefConfig->shForceNonSefIfHttps) { _log('Returning shSefRelToAbs : Forced non sef if https'); return shFinalizeURL($string); } $database =& JFactory::getDBO(); $shOrigString = $string; $shMosMsg = shGetMosMsg($string); // V x 01/09/2007 22:45:52 $string = shCleanUpMosMsg($string); // V x 01/09/2007 22:45:52 // V x : removed shJoomfish module. Now we set $mosConfi_lang here $shOrigLang = $shMosConfig_locale; // save current language $shLanguage = shGetURLLang($string); // target language in URl is always first choice if (empty($shLanguage)) { $shLanguage = !empty($shLanguageParam) ? $shLanguageParam : $shMosConfig_locale; } // V 1.3.1 protect against those drop down lists if (strpos($string, 'this.options[selectedIndex].value') !== false) { $string .= '&lang=' . shGetIsoCodeFromName($shLanguage); return $string; } $shMosConfig_locale = $shLanguage; _log('Language used : ' . $shLanguage); // V 1.2.4.t workaround for old links like option=compName instead of option=com_compName if (strpos(strtolower($string), 'option=login') === false && strpos(strtolower($string), 'option=logout') === false && strpos(strtolower($string), 'option=&') === false && JString::substr(strtolower($string), -7) != 'option=' && strpos(strtolower($string), 'option=cookiecheck') === false && strpos(strtolower($string), 'option=') !== false && strpos(strtolower($string), 'option=com_') === false) { $string = str_replace('option=', 'option=com_', $string); } // V 1.2.4.k added homepage check : needed in case homepage is not com_frontpage if (empty($shHomeLink)) { // first, find out about homepage link, from DB. homepage is not always /index.php or similar // it can be a link to anything, a page, a component,... $menu =& shRouter::shGetMenu(); $shHomePage =& $menu->getDefault(); if ($shHomePage) { if (JString::substr($shHomePage->link, 0, 9) == 'index.php' && !preg_match('/Itemid=[0-9]*/', $shHomePage->link)) { // and it does not have an Itemid $shHomePage->link .= ($shHomePage->link == 'index.php' ? '?' : '&') . 'Itemid=' . $shHomePage->id; // then add itemid } $shHomeLink = $shHomePage->link; if (!strpos($shHomeLink, 'lang=')) { // V 1.2.4.q protect against not existing $shDefaultIso = shGetIsoCodeFromName(shGetDefaultLang()); $shSepString = JString::substr($shHomeLink, -9) == 'index.php' ? '?' : '&'; $shHomeLink .= $shSepString . 'lang=' . $shDefaultIso; } $shHomeLink = shSortUrl($shHomeLink); // $shHomeLink has lang info, whereas $homepage->link may or may not } _log('HomeLink = ' . $shHomeLink); } // V 1.2.4.j string to be appended to URL, but not saved to DB $shAppendString = ''; $shRebuildNonSef = array(); $shComponentType = ''; // V w initialize var to avoid notices if ($shHomeLink) { // now check URL against our homepage, so as to always return / if homepage $v1 = JString::ltrim(str_replace($GLOBALS['shConfigLiveSite'], '', $string), '/'); // V 1.2.4.m : remove anchor if any $v2 = explode('#', $v1); $v1 = $v2[0]; $shAnchor = isset($v2[1]) ? '#' . $v2[1] : ''; $shSepString = JString::substr($v1, -9) == 'index.php' ? '?' : '&'; $shLangString = $shSepString . 'lang=' . shGetIsoCodeFromName($shLanguage); if (!strpos($v1, 'lang=')) { $v1 .= $shLangString; } $v1 = str_replace('&', '&', shSortURL($v1)); // V 1.2.4.t check also without pagination info if (strpos($v1, 'limitstart=0') !== false) { // the page has limitstart=0 $stringNoPag = shCleanUpPag($v1); // remove paging info to be sure this is not homepage } else { $stringNoPag = null; } if ($v1 == $shHomeLink || $v1 == 'index.php' . $shLangString || $stringNoPag == $shHomeLink) { // V 1.2.4.t 24/08/2007 11:07:49 $shTemp = $v1 == $shHomeLink || shIsDefaultLang($shLanguage) ? '' : shGetIsoCodeFromName($shLanguage) . '/'; //10/08/2007 17:28:14 if (!empty($shMosMsg)) { // V x 01/09/2007 22:48:01 $shTemp .= '?' . $shMosMsg; } if (!empty($sefConfig->shForcedHomePage)) { // V 1.2.4.t $shTmp = $shTemp . $shAnchor; $ret = shFinalizeURL($sefConfig->shForcedHomePage . (empty($shTmp) ? '' : '/' . $shTmp)); if (empty($uri)) { // if no URI, append remaining vars directly to the string $ret .= $shAppendString; } else { shRebuildVars($shAppendString, $uri); } $shMosConfig_locale = $shOrigLang; _log('Returning shSefRelToAbs 1 with ' . $ret); return $ret; } else { $shRewriteBit = shIsDefaultLang($shLanguage) ? '/' : $sefConfig->shRewriteStrings[$sefConfig->shRewriteMode]; $ret = shFinalizeURL($GLOBALS['shConfigLiveSite'] . $shRewriteBit . $shTemp . $shAnchor); if (empty($uri)) { // if no URI, append remaining vars directly to the string $ret .= $shAppendString; } else { shRebuildVars($shAppendString, $uri); } $shMosConfig_locale = $shOrigLang; _log('Returning shSefRelToAbs 2 with ' . $ret); return $ret; } } } $newstring = str_replace($GLOBALS['shConfigLiveSite'] . '/', '', $string); // check for url to same site, but with SSL : Joomla 1.5 does not allow it yet //$liveSiteSsl = str_replace('http://', 'https://', $GLOBALS['shConfigLiveSite']); //$newStringSsl = str_replace($liveSiteSsl.'/', '', $string); $letsGo = JString::substr($newstring, 0, 9) == 'index.php' && strpos($newstring, 'this.options[selectedIndex\\].value') === false; $letsGoSsl = false; if ($letsGo || $letsGoSsl) { // Replace & character variations. $string = str_replace(array('&', '&'), array('&', '&'), $letsGo ? $newstring : $newStringSsl); $newstring = $string; // V 1.2.4.q $shSaveString = $string; // warning : must add &lang=xx (only if it does not exists already), so as to be able to recognize the SefURL in the db if it's there if (!strpos($string, 'lang=')) { $shSepString = JString::substr($string, -9) == 'index.php' ? '?' : '&'; $anchorTable = explode('#', $string); // V 1.2.4.m remove anchor before adding language $string = $anchorTable[0]; $string .= $shSepString . 'lang=' . shGetIsoCodeFromName($shLanguage) . (!empty($anchorTable[1]) ? '#' . $anchorTable[1] : ''); // V 1.2.4.m then stitch back anchor } $URI = new sh_Net_URL($string); // V 1.2.4.l need to save unsorted URL if (count($URI->querystring) > 0) { // Import new vars here. $option = null; $task = null; //$sid = null; V 1.2.4.s // sort GET parameters to avoid some issues when same URL is produced with options not // in the same order, ie index.php?option=com_virtuemart&category_id=3&Itemid=2&lang=fr // Vs index.php?category_id=3&option=com_virtuemart&Itemid=2&lang=fr ksort($URI->querystring); // sort URL array $string = shSortUrl($string); // now we are ready to extract vars $shGETVars = $URI->querystring; extract($URI->querystring, EXTR_REFS); } if (empty($option)) { // V 1.2.4.r protect against empty $option : we won't know what to do $shMosConfig_locale = $shOrigLang; _log('Returning shSefRelToAbs 3 with ' . $shOrigString); return $shOrigString; } // get plugin associated with the extension $extPlugin =& Sh404sefFactory::getExtensionPlugin($option); // get component type $shComponentType = $extPlugin->getComponentType(); $shOption = str_replace('com_', '', $option); //list of extension we always skip $alwaysSkip = array('jce', 'akeeba'); if (in_array($shOption, $alwaysSkip)) { $shComponentType = Sh404sefClassBaseextplugin::TYPE_SKIP; } // V 1.2.4.s : fallback to to JoomlaSEF if no extension available // V 1.2.4.t : this is too early ; it prevents manual custom redirect to be checked agains the requested non-sef URL _log('Component type = ' . $shComponentType); // is there a named anchor attached to $string? If so, strip it off, we'll put it back later. if ($URI->anchor) { $string = str_replace('#' . $URI->anchor, '', $string); } // V 1.2.4.m // shumisha special homepage processing (in other than default language) if (shIsHomePage($string) || $string == 'index.php') { $sefstring = ''; $urlType = shGetSefURLFromCacheOrDB($string, $sefstring); // still use it so we need it both ways if (($urlType == sh404SEF_URLTYPE_NONE || $urlType == sh404SEF_URLTYPE_404) && empty($showall) && (!empty($limit) || !isset($limit) && !empty($limitstart))) { $urlType = shGetSefURLFromCacheOrDB(shCleanUpPag($string), $sefstring); // V 1.2.4.t check also without page info //to be able to add pagination on custom //redirection or multi-page homepage if ($urlType != sh404SEF_URLTYPE_NONE && $urlType != sh404SEF_URLTYPE_404) { $sefstring = shAddPaginationInfo(@$limit, @$limitstart, @showall, 1, $string, $sefstring, null); // a special case : com_content does not calculate pagination right // for frontpage and blog, they include links shown at the bottom in the calculation of number of items // For instance, with joomla sample data, the frontpage has only 5 articles // but the view sets $limit to 9 !!! if ($option == 'com_content' && isset($layout) && $layout == 'blog' || $option == 'com_content' && isset($view) && $view == 'frontpage') { $listLimit = shGetDefaultDisplayNumFromURL($string, $includeBlogLinks = true); $string = shSetURLVar($string, 'limit', $listLimit); $string = shSortUrl($string); } // that's a new URL, so let's add it to DB and cache shAddSefUrlToDBAndCache($string, $sefstring, 0, $urlType); // created url must be of same type as original } if ($urlType == sh404SEF_URLTYPE_NONE || $urlType == sh404SEF_URLTYPE_404) { require_once sh404SEF_FRONT_ABS_PATH . 'sef_ext.php'; $sef_ext = new sef_404(); // Rewrite the URL now. // a special case : com_content does not calculate pagination right // for frontpage and blog, they include links shown at the bottom in the calculation of number of items // For instance, with joomla sample data, the frontpage has only 5 articles // but the view sets $limit to 9 !!! if ($option == 'com_content' && isset($layout) && $layout == 'blog' || $option == 'com_content' && isset($view) && $view == 'frontpage') { $listLimit = shGetDefaultDisplayNumFromURL($string, $includeBlogLinks = true); $string = shSetURLVar($string, 'limit', $listLimit); $string = shSortUrl($string); //$URI->addQueryString( 'limit', $listLimit); } $urlVars = is_array($URI->querystring) ? array_map('urldecode', $URI->querystring) : $URI->querystring; $sefstring = $sef_ext->create($string, $urlVars, $shAppendString, $shLanguage, $shOrigString, $originalUri); // V 1.2.4.s added original string } } else { if ($urlType == sh404SEF_URLTYPE_NONE || $urlType == sh404SEF_URLTYPE_404) { // not found but no $limit or $limitstart $sefstring = shGetIsoCodeFromName($shLanguage) . '/'; shAddSefUrlToDBAndCache($string, $sefstring, 0, sh404SEF_URLTYPE_AUTO); // create it } } // V 1.2.4.j : added $shAppendString to pass non sef parameters. For use with parameters that won't be stored in DB $ret = $GLOBALS['shConfigLiveSite'] . (empty($sefstring) ? '' : $sefConfig->shRewriteStrings[$sefConfig->shRewriteMode] . $sefstring); // not valid with 1.5 anymore ; //if (!empty($shMosMsg)) // V x 01/09/2007 22:48:01 // $ret .= (empty($shAppendString) || $sefConfig->shRewriteStrings[$sefConfig->shRewriteMode] == '/index.php?/' ? '?':'&').$shMosMsg; $ret = shFinalizeURL($ret); if (empty($uri)) { // if no URI, append remaining vars directly to the string $ret .= $shAppendString; } else { shRebuildVars($shAppendString, $uri); } $shMosConfig_locale = $shOrigLang; _log('Returning shSefRelToAbs 4 with ' . $ret); return $ret; } if (isset($option) && !($option == 'com_content' && @$task == 'edit') && strtolower($option) != 'com_sh404sef') { // V x 29/08/2007 23:19:48 // check also that option = com_content, otherwise, breaks some comp switch ($shComponentType) { case Sh404sefClassBaseextplugin::TYPE_SKIP: $sefstring = $shSaveString; // V 1.2.4.q : restore untouched URL, except anchor // which will be added later break; case Sh404sefClassBaseextplugin::TYPE_SIMPLE: /* case 'sh404SEFFallback': // v 1.2.4.t*/ // check for custom urls $sefstring = ''; $urlType = shGetSefURLFromCacheOrDB($string, $sefstring); // if no custom found, then build default url if ($urlType != sh404SEF_URLTYPE_CUSTOM) { // if not found then fall back to Joomla! SEF if (isset($URI)) { unset($URI); } $sefstring = 'component/'; $URI = new sh_Net_URL(shSortUrl($shSaveString)); if (count($URI->querystring) > 0) { foreach ($URI->querystring as $key => $value) { if (is_array($value)) { foreach ($value as $k => $v) { // fix for arrays, thanks doorknob $sefstring .= $key . '[' . $k . '],' . $v . '/'; } } else { $sefstring .= $key . ',' . $value . '/'; } } $sefstring = str_replace('option/', '', $sefstring); } } break; default: $sefstring = ''; // base case: $urlType = shGetSefURLFromCacheOrDB($string, $sefstring); // first special case. User may have customized paginated urls // this will be picked up by the line above, except if we're talking about // a category or section blog layout, where Joomla does not uses the correct // value for limit if (($urlType == sh404SEF_URLTYPE_NONE || $urlType == sh404SEF_URLTYPE_404) && empty($showall) && (!empty($limit) || !isset($limit) && !empty($limitstart))) { if ($option == 'com_content' && isset($layout) && $layout == 'blog' || $option == 'com_content' && isset($view) && $view == 'frontpage') { $listLimit = shGetDefaultDisplayNumFromURL($string, $includeBlogLinks = true); $tmpString = shSetURLVar($string, 'limit', $listLimit); $tmpString = shSortUrl($tmpString); $urlType = shGetSefURLFromCacheOrDB($tmpString, $sefstring); if ($urlType != sh404SEF_URLTYPE_NONE && $urlType != sh404SEF_URLTYPE_404) { // we found a match with pagination info! $string = $tmpString; } } } // now let's try again without any pagination at all if (($urlType == sh404SEF_URLTYPE_NONE || $urlType == sh404SEF_URLTYPE_404) && empty($showall) && (!empty($limit) || !isset($limit) && !empty($limitstart))) { $urlType = shGetSefURLFromCacheOrDB(shCleanUpPag($string), $sefstring); // search without pagination info if ($urlType != sh404SEF_URLTYPE_NONE && $urlType != sh404SEF_URLTYPE_404) { $sefstring = shAddPaginationInfo(@$limit, @$limitstart, @showall, 1, $string, $sefstring, null); // a special case : com_content does not calculate pagination right // for frontpage and blog, they include links shown at the bottom in the calculation of number of items // For instance, with joomla sample data, the frontpage has only 5 articles // but the view sets $limit to 9 !!! if ($option == 'com_content' && isset($layout) && $layout == 'blog' || $option == 'com_content' && isset($view) && $view == 'frontpage') { $listLimit = shGetDefaultDisplayNumFromURL($string, $includeBlogLinks = true); $string = shSetURLVar($string, 'limit', $listLimit); $string = shSortUrl($string); } // that's a new URL, so let's add it to DB and cache _log('Created url based on non paginated base url:' . $string); shAddSefUrlToDBAndCache($string, $sefstring, 0, $urlType); } } if ($urlType == sh404SEF_URLTYPE_NONE) { // If component has its own sef_ext plug-in included. $shDoNotOverride = in_array($shOption, $sefConfig->shDoNotOverrideOwnSef); if (shFileExists(sh404SEF_ABS_PATH . 'components/' . $option . '/sef_ext.php') && ($shDoNotOverride || !$shDoNotOverride && (!shFileExists(sh404SEF_ABS_PATH . 'components/com_sh404sef/sef_ext/' . $option . '.php') && !shFileExists(sh404SEF_ABS_PATH . 'components/' . $option . '/sef_ext/' . $option . '.php')))) { // Load the plug-in file. V 1.2.4.s changed require_once to include include_once sh404SEF_ABS_PATH . 'components/' . $option . '/sef_ext.php'; $_SEF_SPACE = $sefConfig->replacement; $comp_name = str_replace('com_', '', $option); $className = 'sef_' . $comp_name; $sef_ext = new $className(); // V x : added default string in params if (empty($sefConfig->defaultComponentStringList[$comp_name])) { $title[] = getMenuTitle($option, null, isset($Itemid) ? @$Itemid : null, null, $shLanguage); } else { $title[] = $sefConfig->defaultComponentStringList[$comp_name]; } // V 1.2.4.r : clean up URL BEFORE sending it to sef_ext files, to have control on what they do // remove lang information, we'll put it back ourselves later //$shString = preg_replace( '/(&|\?)lang=[a-zA-Z]{2,3}/iU' ,'', $string); // V 1.2.4.t use original non-sef string. Some sef_ext files relies on order of params, which may // have been changed by sh404SEF $shString = preg_replace('/(&|\\?)lang=[a-zA-Z]{2,3}/iU', '', $shSaveString); $finalstrip = explode("|", $sefConfig->stripthese); $shString = str_replace('&', '&', $shString); _log('Sending to own sef_ext.php plugin : ' . $shString); $sefstring = $sef_ext->create($shString); _log('Created by sef_ext.php plugin : ' . $sefstring); $sefstring = str_replace("%10", "%2F", $sefstring); $sefstring = str_replace("%11", $sefConfig->replacement, $sefstring); $sefstring = rawurldecode($sefstring); if ($sefstring == $string) { if (!empty($shMosMsg)) { // V x 01/09/2007 22:48:01 $string .= '?' . $shMosMsg; } $ret = shFinalizeURL($string); $shMosConfig_locale = $shOrigLang; _log('Returning shSefRelToAbs 5 with ' . $ret); return $ret; } else { // V 1.2.4.p : sef_ext extensions for opensef/SefAdvance do not always replace ' $sefstring = str_replace('\'', $sefConfig->replacement, $sefstring); // some ext. seem to html_special_chars URL ? $sefstring = str_replace(''', $sefConfig->replacement, $sefstring); // V w 27/08/2007 13:23:56 $sefstring = str_replace(' ', $_SEF_SPACE, $sefstring); $sefstring = str_replace(' ', '', (shInsertIsoCodeInUrl($option, $shLanguage) ? shGetIsoCodeFromName($shLanguage) . '/' : '') . titleToLocation($title[0]) . '/' . $sefstring . ($sefstring != '' ? $sefConfig->suffix : '')); if (!empty($sefConfig->suffix)) { $sefstring = str_replace('/' . $sefConfig->suffix, $sefConfig->suffix, $sefstring); } //$finalstrip = explode("|", $sefConfig->stripthese); $sefstring = str_replace($finalstrip, $sefConfig->replacement, $sefstring); $sefstring = str_replace($sefConfig->replacement . $sefConfig->replacement . $sefConfig->replacement, $sefConfig->replacement, $sefstring); $sefstring = str_replace($sefConfig->replacement . $sefConfig->replacement, $sefConfig->replacement, $sefstring); $suffixthere = 0; if (!empty($sefConfig->suffix) && strpos($sefstring, $sefConfig->suffix) !== false) { // V 1.2.4.s $suffixthere = strlen($sefConfig->suffix); } $takethese = str_replace("|", "", $sefConfig->friendlytrim); $sefstring = JString::trim(JString::substr($sefstring, 0, strlen($sefstring) - $suffixthere), $takethese); $sefstring .= $suffixthere == 0 ? '' : $sefConfig->suffix; // version u 26/08/2007 17:27:16 // V 1.2.4.m store it in DB so as to be able to use sef_ext plugins really ! $string = str_replace('&', '&', $string); // V 1.2.4.r without mod_rewrite $shSefString = shAdjustToRewriteMode($sefstring); // V 1.2.4.p check for various URL for same content $dburl = ''; // V 1.2.4.t prevent notice error $urlType = sh404SEF_URLTYPE_NONE; if ($sefConfig->shUseURLCache) { $urlType = Sh404sefHelperCache::getNonSefUrlFromCache($shSefString, $dburl); } $newMaxRank = 0; // V 1.2.4.s $shDuplicate = false; if ($sefConfig->shRecordDuplicates || $urlType == sh404SEF_URLTYPE_NONE) { // V 1.2.4.q + V 1.2.4.s+t $sql = "SELECT newurl, rank, dateadd FROM #__redirection WHERE oldurl = " . $database->Quote($shSefString) . " ORDER BY rank ASC"; $database->setQuery($sql); $dbUrlList = $database->loadObjectList(); if (count($dbUrlList) > 0) { $dburl = $dbUrlList[0]->newurl; $newMaxRank = $dbUrlList[count($dbUrlList) - 1]->rank + 1; $urlType = $dbUrlList[0]->dateadd == '0000-00-00' ? sh404SEF_URLTYPE_AUTO : sh404SEF_URLTYPE_CUSTOM; } } if ($urlType != sh404SEF_URLTYPE_NONE && $dburl != $string) { $shDuplicate = true; } $urlType = $urlType == sh404SEF_URLTYPE_NONE ? sh404SEF_URLTYPE_AUTO : $urlType; _log('Adding from sef_ext to DB : ' . $shSefString . ' | rank = ' . ($shDuplicate ? $newMaxRank : 0)); shAddSefUrlToDBAndCache($string, $shSefString, $shDuplicate ? $newMaxRank : 0, $urlType); } } else { $string = JString::trim($string, "&?"); // V 1.2.4.q a trial in better handling homepage articles if (shIsCurrentPageHome() && $option == 'com_content' && isset($task) && $task == 'view' && $sefConfig->guessItemidOnHomepage) { $string = preg_replace('/(&|\\?)Itemid=[^&]*/i', '', $string); // we remove Itemid, as com_content plugin $Itemid = null; // will hopefully do a better job at finding the right one unset($URI->querystring['Itemid']); unset($shGETVars['Itemid']); } require_once sh404SEF_FRONT_ABS_PATH . 'sef_ext.php'; $sef_ext = new sef_404(); // Rewrite the URL now. // V 1.2.4.s added original string // a special case : com_content does not calculate pagination right // for frontpage and blog, they include links shown at the bottom in the calculation of number of items // For instance, with joomla sample data, the frontpage has only 5 articles // but the view sets $limit to 9 !!! if ($option == 'com_content' && isset($layout) && $layout == 'blog' || $option == 'com_content' && isset($view) && $view == 'frontpage') { $listLimit = shGetDefaultDisplayNumFromURL($string, $includeBlogLinks = true); $string = shSetURLVar($string, 'limit', $listLimit); $string = shSortUrl($string); //$URI->addQueryString( 'limit', $listLimit); } $sefstring = $sef_ext->create($string, $URI->querystring, $shAppendString, $shLanguage, $shOrigString, $originalUri); _log('Created sef url from default plugin: ' . $sefstring); } } } // end of cache check shumisha if (isset($sef_ext)) { unset($sef_ext); } // V 1.2.4.j // V 1.2.4.r : checked for double // // V 1.2.4.r try sef without mod_rewrite $shRewriteBit = $shComponentType == Sh404sefClassBaseextplugin::TYPE_SKIP ? '/' : $sefConfig->shRewriteStrings[$sefConfig->shRewriteMode]; if (strpos($sefstring, 'index.php') === 0) { $shRewriteBit = '/'; } // V 1.2.4.t bug #119 $string = $GLOBALS['shConfigLiveSite'] . $shRewriteBit . JString::ltrim($sefstring, '/') . ($URI->anchor ? "#" . $URI->anchor : ''); } else { // V x 03/09/2007 13:47:37 editing content $shComponentType = Sh404sefClassBaseextplugin::TYPE_SKIP; // will prevent turning & into & _log('shSefrelfToAbs: option not set, skipping'); } $ret = $string; // $ret = str_replace('itemid', 'Itemid', $ret); // V 1.2.4.t bug #125 _log('(1) Setting shSefRelToAbs return string as: ' . $ret); } if (!isset($ret)) { $ret = $string; _log('(2) Setting shSefRelToAbs return string as: ' . $ret); } //if (!empty($shMosMsg) && strpos($ret, $shMosMsg) === false) // V x 01/09/2007 23:02:00 // $ret .= (strpos( $ret, '?') === false || $sefConfig->shRewriteStrings[$sefConfig->shRewriteMode] == '/index.php?/'? '?':'&').$shMosMsg; $ret = $shComponentType == Sh404sefClassBaseextplugin::TYPE_DEFAULT ? shFinalizeURL($ret) : $ret; // V w 27/08/2007 13:21:28 _log('(3) shSefRelToAbs return string after shFinalize: ' . $ret); if (empty($uri) || $shComponentType == Sh404sefClassBaseextplugin::TYPE_SKIP) { // we don't have a uri : we must be doing a redirect from non-sef to sef or similar $ret .= $shAppendString; // append directly to url _log('(4) shSefRelToAbs return string after appendString: ' . $ret); } else { if (empty($sefstring) || !empty($sefstring) && strpos($sefstring, 'index.php') !== 0) { shRebuildVars($shAppendString, $uri); // instead, add to uri. Joomla will put everything together. Only do this if we have a sef url, and not if we have a non-sef _log('(5) shSefRelToAbs no sefstring, adding rebuild vars : ' . $shAppendString); } } $shMosConfig_locale = $shOrigLang; _log('shSefRelToAbs: finally returning: ' . $ret); return $ret; }
protected function _prepareLink($menuItem, $forceLanguage = null) { $link = shSetURLVar($menuItem->link, 'Itemid', $menuItem->id); $linkLang = shGetURLLang($link); if (empty($linkLang)) { // if no language in link, use current, except if 'All', in which case use actual default if (empty($forceLanguage)) { $itemLanguage = $menuItem->language == '*' ? shGetDefaultLanguageSef() : shGetIsoCodeFromName($menuItem->language); } else { $itemLanguage = $forceLanguage; } $link = shSetUrlVar($link, 'lang', $itemLanguage); } return $link; }
private function _mustCreatePageid($nonSefUrl) { // currently disabled by sef url plugin if (!self::$_mustCreate) { return false; } // if enabled at sef url plugin level, check configuration $sefConfig =& Sh404sefFactory::getConfig(); // check global flags if (!$sefConfig->enablePageId || $sefConfig->stopCreatingShurls) { return false; } // make sure we have a language $pageInfo =& Sh404sefFactory::getPageInfo(); $nonSefUrl = shSetURLVar($nonSefUrl, 'lang', $pageInfo->shMosConfig_shortcode); // not on homepage if (shIsAnyHomepage($nonSefUrl)) { return ''; } // check at component level $option = shGetURLVar($nonSefUrl, 'option'); $option = str_replace('com_', '', $option); $enable = !empty($option) && in_array($option, $sefConfig->compEnablePageId); // check non sef url content black list $sefConfig->shurlNonSefBlackList = JString::trim($sefConfig->shurlNonSefBlackList); if (empty($sefConfig->shurlNonSefBlackList)) { $blackList = array(); } else { if (strpos($sefConfig->shurlNonSefBlackList, '|') !== false) { $blackList = explode('|', $sefConfig->shurlNonSefBlackList); } else { $blackList = array($sefConfig->shurlNonSefBlackList); } } if (!empty($blackList)) { foreach ($blackList as $bit) { if (!empty($bit) && strpos($nonSefUrl, $bit) !== false) { // match, don't create a shurl for this non sef url $enable = false; break; } } } return $enable; }
shDoSecurityChecks($shPageInfo->QUERY_STRING, false); // check this newly created URL } // V 1.2.4.l added automatic redirect of Joomla standard SEF to sh404SEF URL. // V 1.2.4.p restrict automatic redirect to Joomla own sef, otherwise it breaks opensef/sefadvance sef_ext files // V x : allow redirect even if Joomfish, if URL is already in DB but check if reverted string is valid // may not be so in case of attacks or badly formed J! SEF url if (is_valid($shPageInfo->QUERY_STRING) && ($sef_ext_class == 'sef_content' || $sef_ext_class == 'sef_component')) { // if we have Joomla standard SEF if (empty($shPageInfo->autoRedirectsDisabled) && $sefConfig->shRedirectJoomlaSefToSef && $shPageInfo->URI->url && empty($_POST)) { // and are set to auto-redirect to SEF URLs // try fetching from DB $shSefUrl = null; $nonSefURL = 'index.php?' . $shPageInfo->QUERY_STRING; if (strpos($nonSefURL, 'lang=') === false) { $nonSefURL = shSetURLVar($nonSefURL, 'lang', shGetIsoCodeFromName($GLOBALS['shMosConfig_locale'])); } $urlType = shGetSefURLFromCacheOrDB(shSortURL($nonSefURL), $shSefUrl); if ($urlType == sh404SEF_URLTYPE_AUTO || $urlType == sh404SEF_URLTYPE_CUSTOM) { // found a match $shRewriteBit = $sefConfig->shRewriteStrings[$sefConfig->shRewriteMode]; $shSefUrl = (empty($shPageInfo->shHttpsSave) ? $GLOBALS['shConfigLiveSite'] : $shPageInfo->shHttpsSave) . $shRewriteBit . JString::ltrim($shSefUrl, '/') . ($shPageInfo->URI->anchor ? "#" . $shPageInfo->URI->anchor : ''); _log('Redirecting J! sef URl to existing SEF URL : ' . $shSefUrl); shRedirect($shSefUrl); } if (!shIsMultilingual() || shIsMultilingual() == 'joomfish' && shGetNameFromIsoCode(shDecideRequestLanguage()) == $GLOBALS['shMosConfig_locale']) { $shSefUrl = (empty($shPageInfo->shHttpsSave) ? $GLOBALS['shConfigLiveSite'] : $shPageInfo->shHttpsSave) . '/index.php?' . $shPageInfo->QUERY_STRING; $GLOBALS['mosConfig_defaultLang'] = $shMosConfig_locale; // V x 01/09/2007 22:05:11 joomfish not initialised so we must do // this otherwise shGetDefaultLanguage will not work // check if language in URL
function shGuessLanguageAndRedirect($queryString) { if (!sh404SEF_DE_ACTIVATE_LANG_AUTO_REDIRECT && shIsMultilingual() == 'joomfish') { $cookieLang = shGetCookieLanguage(); $sessionExists = shLookupSession(); $reqLang = JRequest::getVar('lang', ''); $targetLang = ''; if (!$sessionExists) { // no session and not coming from self if (empty($cookieLang)) { // this is really first visit (or visitor does not accept cookie) $discoveredLang = shGetParamUserLanguage(); if ($discoveredLang != $reqLang) { $targetLang = $discoveredLang; } } else { // returning visitor, with only a cookie set if ($cookieLang != $reqLang) { $targetLang = $cookieLang; } } } if (!empty($targetLang)) { // 303 redirect to same URL in preferred language $queryString = shSetURLVar('index.php?' . $queryString, 'lang', $targetLang); _log('Redirecting (303) to user language |cookie = ' . $cookieLang . '|session=' . $sessionExists . '|req=' . $reqLang . '|target=' . $targetLang); shRedirect($GLOBALS['shConfigLiveSite'] . '/' . $queryString, '', 303); } } }