/** * Create the redirection of an alias * * @return boolean true on success, false on failure * @access public * @static */ function redirect() { //get aliases for current folder $dirname = array_pop(explode(DIRECTORY_SEPARATOR, dirname($_SERVER['SCRIPT_NAME']))); $aliases = CMS_module_cms_aliases::getByName($dirname); if (!$aliases) { //no alias found, go to 404 CMS_grandFather::raiseError('No alias found for directory ' . dirname($_SERVER['SCRIPT_NAME'])); CMS_view::redirect(PATH_SPECIAL_PAGE_NOT_FOUND_WR, true, 301); } //check each aliases returned to get the one which respond to current alias $matchAlias = false; $domain = @parse_url($_SERVER['REQUEST_URI'], PHP_URL_HOST) ? @parse_url($_SERVER['REQUEST_URI'], PHP_URL_HOST) : (@parse_url($_SERVER['HTTP_HOST'], PHP_URL_HOST) ? @parse_url($_SERVER['HTTP_HOST'], PHP_URL_HOST) : $_SERVER['HTTP_HOST']); $websites = array(); if ($domain) { $websites = CMS_websitesCatalog::getWebsitesFromDomain($domain); } foreach ($aliases as $alias) { if (!$matchAlias && dirname($_SERVER['SCRIPT_NAME']) == substr($alias->getPath(), 0, -1)) { if ($websites) { foreach ($websites as $website) { //alias match path, check for website if (!$alias->getWebsites() || !$website || in_array($website->getId(), $alias->getWebsites())) { //alias match website, use it $matchAlias = $alias; } } } else { //alias match path, check for website if (!$alias->getWebsites()) { //alias match website, use it $matchAlias = $alias; } } } } if (!$matchAlias) { //no alias found, go to 404 CMS_grandFather::raiseError('No alias found for directory ' . dirname($_SERVER['SCRIPT_NAME']) . ' and domain ' . $domain); CMS_view::redirect(PATH_SPECIAL_PAGE_NOT_FOUND_WR, true, 301); } //if alias is used as a page url, return page if ($matchAlias->urlReplaced()) { if (io::isPositiveInteger($matchAlias->getPageID())) { $page = CMS_tree::getPageById($matchAlias->getPageID()); } else { //no valid page set, go to 404 $matchAlias->raiseError('No page set for alias ' . $matchAlias->getID()); CMS_view::redirect(PATH_SPECIAL_PAGE_NOT_FOUND_WR, true, 301); } if (!$page || $page->hasError()) { //no valid page found, go to 404 $matchAlias->raiseError('Invalid page ' . $matchAlias->getPageID() . ' for alias ' . $matchAlias->getID()); CMS_view::redirect(PATH_SPECIAL_PAGE_NOT_FOUND_WR, true, 301); } //return page path $pPath = $page->getHTMLURL(false, false, PATH_RELATIVETO_FILESYSTEM); if ($pPath) { if (file_exists($pPath)) { return $pPath; } elseif ($page->regenerate(true)) { clearstatcache(); if (file_exists($pPath)) { return $pPath; } } } //no valid url page found, go to 404 $matchAlias->raiseError('Invalid url page ' . $matchAlias->getPageID() . ' for alias ' . $matchAlias->getID()); CMS_view::redirect(PATH_SPECIAL_PAGE_NOT_FOUND_WR, true, 301); } else { //this is a redirection $params = isset($_SERVER['QUERY_STRING']) && $_SERVER['QUERY_STRING'] ? '?' . $_SERVER['QUERY_STRING'] : ''; if (isset($_SERVER['HTTP_REFERER'])) { header("Referer: " . $_SERVER['HTTP_REFERER']); } if (io::isPositiveInteger($matchAlias->getPageID())) { //it's a redirection to an Automne Page $page = CMS_tree::getPageById($matchAlias->getPageID()); if ($page && !$page->hasError()) { $pageURL = CMS_tree::getPageValue($matchAlias->getPageID(), 'url'); if ($pageURL) { CMS_view::redirect($pageURL . $params, true, $matchAlias->isPermanent() ? 301 : 302); } else { //no valid url page found, go to 404 $matchAlias->raiseError('Invalid url page ' . $matchAlias->getPageID() . ' for alias ' . $matchAlias->getID()); CMS_view::redirect(PATH_SPECIAL_PAGE_NOT_FOUND_WR, true, 301); } } else { //no valid page found, go to 404 $matchAlias->raiseError('Invalid page ' . $matchAlias->getPageID() . ' for alias ' . $matchAlias->getID()); CMS_view::redirect(PATH_SPECIAL_PAGE_NOT_FOUND_WR, true, 301); } } elseif ($matchAlias->getURL()) { //it's a redirection to an URL CMS_view::redirect($matchAlias->getURL(), true, $matchAlias->isPermanent() ? 301 : 302); } else { //no valid redirection found, go to 404 $matchAlias->raiseError('Invalid redirection for alias ' . $matchAlias->getID()); CMS_view::redirect(PATH_SPECIAL_PAGE_NOT_FOUND_WR, true, 301); } } }