diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 0a95132681a..c00bb2b7aab 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -4,6 +4,7 @@ Yii Framework 2 Change Log 2.0.50 under development ------------------------ +- Bug #17191: Fix `UrlManager::createUrl($params)`, `UrlManager::createAbsoluteUrl($params, $scheme)` methods to rely on `BaseUrl::isRelative($url)` method (ggh2e3) - Bug #17191: Fixed `BaseUrl::isRelative($url)` method in `yii\helpers\BaseUrl` (ggh2e3) - Bug #18469: Fixed `Link::serialize(array $links)` method in `yii\web\Link` (ggh2e3) - Bug #20040: Fix type `boolean` in `MSSQL` (terabytesoftw) diff --git a/framework/web/UrlManager.php b/framework/web/UrlManager.php index 292c4bc3e70..8e006b60d76 100644 --- a/framework/web/UrlManager.php +++ b/framework/web/UrlManager.php @@ -446,22 +446,16 @@ public function createUrl($params) } if ($url !== false) { - if (strpos($url, '://') !== false) { - if ($baseUrl !== '' && ($pos = strpos($url, '/', 8)) !== false) { - return substr($url, 0, $pos) . $baseUrl . substr($url, $pos) . $anchor; - } - - return $url . $baseUrl . $anchor; - } elseif (strncmp($url, '//', 2) === 0) { - if ($baseUrl !== '' && ($pos = strpos($url, '/', 2)) !== false) { - return substr($url, 0, $pos) . $baseUrl . substr($url, $pos) . $anchor; - } + if (Url::isRelative($url)) { + $url = ltrim($url, '/'); + return "$baseUrl/{$url}{$anchor}"; + } - return $url . $baseUrl . $anchor; + if ($baseUrl !== '' && ($pos = strpos($url, '/', 8)) !== false) { + return substr($url, 0, $pos) . $baseUrl . substr($url, $pos) . $anchor; } - $url = ltrim($url, '/'); - return "$baseUrl/{$url}{$anchor}"; + return $url . $baseUrl . $anchor; } if ($this->suffix !== null) { @@ -559,13 +553,12 @@ public function createAbsoluteUrl($params, $scheme = null) { $params = (array) $params; $url = $this->createUrl($params); - if (strpos($url, '://') === false) { - $hostInfo = $this->getHostInfo(); - if (strncmp($url, '//', 2) === 0) { - $url = substr($hostInfo, 0, strpos($hostInfo, '://')) . ':' . $url; - } else { - $url = $hostInfo . $url; - } + $hostInfo = $this->getHostInfo(); + if (Url::isRelative($url)) { + $url = $hostInfo . $url; + } + if (strncmp($url, '//', 2) === 0) { + $url = substr($hostInfo, 0, strpos($hostInfo, '://')) . ':' . $url; } return Url::ensureScheme($url, $scheme);