Source of file RedirectedURLHandler.php
Size: 5,172 Bytes - Last Modified: 2021-12-23T10:33:52+00:00
/var/www/docs.ssmods.com/process/src/src/Extension/RedirectedURLHandler.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 | <?php namespace SilverStripe\RedirectedURLs\Extension; use SilverStripe\CMS\Controllers\ContentController; use SilverStripe\CMS\Controllers\ModelAsController; use SilverStripe\Control\Director; use SilverStripe\Control\HTTPRequest; use SilverStripe\Control\HTTPResponse; use SilverStripe\Control\HTTPResponse_Exception; use SilverStripe\Control\RequestHandler; use SilverStripe\Core\Convert; use SilverStripe\Core\Extension; use SilverStripe\ORM\ArrayList; use SilverStripe\RedirectedURLs\Model\RedirectedURL; use SilverStripe\Core\Config\Config; /** * Handles the redirection of any url from a controller. * * @package redirectedurls * @author sam@silverstripe.com * @author scienceninjas@silverstripe.com * @property ContentController|ModelAsController|RequestHandler|RedirectedURLHandler $owner */ class RedirectedURLHandler extends Extension { /** * Converts an array of key value pairs to lowercase * * @param array $vars key value pairs * @return array */ protected function arrayToLowercase($vars) { $result = array(); foreach ($vars as $k => $v) { if (is_array($v)) { $result[strtolower($k)] = $this->arrayToLowercase($v); } else { $result[strtolower($k)] = strtolower($v); } } return $result; } protected function getRedirectCode($redirectedURL = false) { if ($redirectedURL instanceof RedirectedURL) { if (isset($redirectedURL->RedirectCode) && intval($redirectedURL->RedirectCode) > 0) { return intval($redirectedURL->RedirectCode); } } $redirectCode = 301; $defaultRedirectCode = intval(Config::inst()->get(RedirectedURL::class, 'default_redirect_code')); if ($defaultRedirectCode > 0) { $redirectCode = $defaultRedirectCode; } return $redirectCode; } /** * @throws HTTPResponse_Exception * @param HTTPRequest $request */ public function onBeforeHTTPError404($request) { $base = strtolower($request->getURL()); $getVars = $this->arrayToLowercase($request->getVars()); // Find all the RedirectedURL objects where the base URL matches. // Assumes the base url has no trailing slash. $SQL_base = Convert::raw2sql(rtrim($base, '/')); $potentials = RedirectedURL::get()->filter(['FromBase' => '/' . $SQL_base])->sort('FromQuerystring DESC'); $listPotentials = new ArrayList(); foreach ($potentials as $potential) { $listPotentials->push($potential); } // Find any matching FromBase elements terminating in a wildcard /* $baseparts = explode('/', $base); for ($pos = count($baseparts) - 1; $pos >= 0; $pos--) { $basestr = implode('/', array_slice($baseparts, 0, $pos)); $basepart = Convert::raw2sql($basestr . '/*'); $basepots = RedirectedURL::get()->filter(['FromBase' => '/' . $basepart])->sort('FromQuerystring DESC'); foreach ($basepots as $basepot) { // If the To URL ends in a wildcard /*, append the remaining request URL elements if ($basepot->RedirectionType === 'External' && substr($basepot->To, -2) === '/*') { $basepot->To = substr($basepot->To, 0, -2) . substr($base, strlen($basestr)); } $listPotentials->push($basepot); } } $matched = null; // Then check the get vars, ignoring any additional get vars that // this URL may have if ($listPotentials) { foreach ($listPotentials as $potential) { $allVarsMatch = true; if ($potential->FromQuerystring) { $reqVars = array(); parse_str($potential->FromQuerystring, $reqVars); foreach ($reqVars as $k => $v) { if (!$v) { continue; } if (!isset($getVars[$k]) || $v != $getVars[$k]) { $allVarsMatch = false; break; } } } if ($allVarsMatch) { $matched = $potential; break; } } } // If there's a match, direct! if ($matched) { $response = new HTTPResponse(); $dest = $matched->Link(); $response->redirect(Director::absoluteURL($dest), $this->getRedirectCode($matched)); throw new HTTPResponse_Exception($response); } // Otherwise check for default MOSS-fixing. if (preg_match('/pages\/default.aspx$/i', $base)) { $newBase = preg_replace('/pages\/default.aspx$/i', '', $base); $response = new HTTPResponse(); $response->redirect(Director::absoluteURL($newBase), $this->getRedirectCode()); throw new HTTPResponse_Exception($response); } } } |