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: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136:
<?php
namespace MvcCore\Ext\Routers\Module;
trait Canonical {
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 ($this->currentDomainRoute !== NULL) {
$targetDomainRoute = $this->currentDomainRoute;
$domainParams = array_intersect_key($requestedParamsClone, $this->requestedDomainParams);
$requestedParamsClone = array_diff_key($requestedParamsClone, $this->requestedDomainParams);
list($domainUrlBaseSection,) = $targetDomainRoute->Url(
$this->request, $domainParams, $this->requestedDomainParams, '', TRUE
);
if (mb_strpos($domainUrlBaseSection, '//') === FALSE)
$domainUrlBaseSection = $request->GetDomainUrl() . $domainUrlBaseSection;
if (mb_strlen($domainUrlBaseSection) > 0 && $domainUrlBaseSection !== $request->GetBaseUrl())
$redirectToCanonicalUrl = TRUE;
}
if ($redirectToCanonicalUrl) {
$selfCanonicalUrl = $this->UrlByQueryString($this->selfRouteName, $requestedParamsClone);
$this->redirect($selfCanonicalUrl, \MvcCore\IResponse::MOVED_PERMANENTLY);
return FALSE;
}
return TRUE;
}
protected function canonicalRedirectRewriteRoutesStrategy () {
$request = $this->request;
$redirectToCanonicalUrl = FALSE;
$defaultParams = $this->GetDefaultParams() ?: [];
if ($this->currentDomainRoute !== NULL) {
$targetDomainRoute = $this->currentDomainRoute;
$domainParams = array_intersect_key($defaultParams, $this->requestedDomainParams);
$defaultParamsClone = array_diff_key($defaultParams, $this->requestedDomainParams);
$requestedParamsClone = array_diff_key($this->requestedParams, $this->requestedDomainParams);
list($domainUrlBaseSection,) = $targetDomainRoute->Url(
$this->request, $domainParams, $defaultParams, '', TRUE
);
list($selfUrlDomainAndBasePart, $selfUrlPathAndQueryPart) = $this->currentRoute->Url(
$request, $requestedParamsClone, $defaultParamsClone, $this->getQueryStringParamsSepatator(), TRUE
);
if (mb_strpos($domainUrlBaseSection, '//') === FALSE)
$domainUrlBaseSection = $request->GetDomainUrl() . $domainUrlBaseSection;
if (mb_strlen($domainUrlBaseSection) > 0 && $domainUrlBaseSection !== $request->GetBaseUrl())
$redirectToCanonicalUrl = TRUE;
} else {
$domainUrlBaseSection = NULL;
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;
}
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);
return FALSE;
}
return TRUE;
}
}