1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116:
<?php
namespace MvcCore\Router;
trait Canonical {
protected function canonicalRedirectIfAny () {
if (
$this->internalRequest || !$this->autoCanonizeRequests ||
$this->request->GetMethod() !== \MvcCore\IRequest::METHOD_GET
) return TRUE;
if ($this->routeByQueryString) {
return $this->canonicalRedirectQueryStringStrategy();
} else if ($this->selfRouteName !== NULL) {
return $this->canonicalRedirectRewriteRoutesStrategy();
}
return TRUE;
}
protected function canonicalRedirectQueryStringStrategy () {
$request = $this->request;
$redirectToCanonicalUrl = FALSE;
$requestGlobalGet = & $request->GetGlobalCollection('get');
$requestedCtrlDc = isset($requestGlobalGet[static::URL_PARAM_CONTROLLER]) ? $requestGlobalGet[static::URL_PARAM_CONTROLLER] : NULL;
$requestedActionDc = isset($requestGlobalGet[static::URL_PARAM_ACTION]) ? $requestGlobalGet[static::URL_PARAM_ACTION] : NULL;
$toolClass = self::$toolClass;
list($dfltCtrlPc, $dftlActionPc) = $this->application->GetDefaultControllerAndActionNames();
$dfltCtrlDc = $toolClass::GetDashedFromPascalCase($dfltCtrlPc);
$dftlActionDc = $toolClass::GetDashedFromPascalCase($dftlActionPc);
$requestedParamsClone = array_merge([], $this->requestedParams);
if ($requestedCtrlDc !== NULL && $requestedCtrlDc === $dfltCtrlDc) {
unset($requestedParamsClone[static::URL_PARAM_CONTROLLER]);
$redirectToCanonicalUrl = TRUE;
}
if ($requestedActionDc !== NULL && $requestedActionDc === $dftlActionDc) {
unset($requestedParamsClone[static::URL_PARAM_ACTION]);
$redirectToCanonicalUrl = TRUE;
}
if ($redirectToCanonicalUrl) {
$selfCanonicalUrl = $this->UrlByQueryString($this->selfRouteName, $requestedParamsClone);
$this->redirect($selfCanonicalUrl, \MvcCore\IResponse::MOVED_PERMANENTLY, 'Canonical URL');
return FALSE;
}
return TRUE;
}
protected function canonicalRedirectRewriteRoutesStrategy () {
$request = $this->request;
$redirectToCanonicalUrl = FALSE;
$defaultParams = $this->GetDefaultParams() ?: [];
list($selfUrlDomainAndBasePart, $selfUrlPathAndQueryPart) = $this->currentRoute->Url(
$request, $this->requestedParams, $defaultParams, $this->getQueryStringParamsSepatator(), TRUE
);
if (mb_strpos($selfUrlDomainAndBasePart, '//') === FALSE)
$selfUrlDomainAndBasePart = $request->GetDomainUrl() . $selfUrlDomainAndBasePart;
if (
mb_strlen($selfUrlDomainAndBasePart) > 0 &&
$selfUrlDomainAndBasePart !== $request->GetBaseUrl()
) {
$redirectToCanonicalUrl = TRUE;
} else if (mb_strlen($selfUrlPathAndQueryPart) > 0) {
$path = $request->GetPath(FALSE);
$requestedUrl = $path === '' ? '/' : $path ;
if (mb_strpos($selfUrlPathAndQueryPart, '?') !== FALSE) {
$selfUrlPathAndQueryPart = rawurldecode($selfUrlPathAndQueryPart);
$requestedUrl .= $request->GetQuery(TRUE, FALSE);
}
if ($selfUrlPathAndQueryPart !== $requestedUrl)
$redirectToCanonicalUrl = TRUE;
}
if ($redirectToCanonicalUrl) {
$selfCanonicalUrl = $this->Url($this->selfRouteName, $this->requestedParams);
$this->redirect($selfCanonicalUrl, \MvcCore\IResponse::MOVED_PERMANENTLY, 'Canonical url');
return FALSE;
}
return TRUE;
}
}