Commit 24257e76 by Qiang Xue

Fixes #3909: `Html::to()` should not prefix base URL to URLs that already contain scheme

parent ca0a1f05
...@@ -47,6 +47,7 @@ Yii Framework 2 Change Log ...@@ -47,6 +47,7 @@ Yii Framework 2 Change Log
- Bug #3817: `yii\rbac\PhpManager::getChildren()` returns null instead of expected empty array (qiangxue) - Bug #3817: `yii\rbac\PhpManager::getChildren()` returns null instead of expected empty array (qiangxue)
- Bug #3843: Fixed Menu bug when using `template` with `encodeLabel` => false (creocoder, umneeq) - Bug #3843: Fixed Menu bug when using `template` with `encodeLabel` => false (creocoder, umneeq)
- Bug #3863: Fixed incorrect js selector for `\yii\widgets\ActiveForm::errorSummaryCssClass` when it contains multiple classes (creocoder, umneeq) - Bug #3863: Fixed incorrect js selector for `\yii\widgets\ActiveForm::errorSummaryCssClass` when it contains multiple classes (creocoder, umneeq)
- Bug #3909: `Html::to()` should not prefix base URL to URLs that already contain scheme (qiangxue)
- Bug: Fixed inconsistent return of `\yii\console\Application::runAction()` (samdark) - Bug: Fixed inconsistent return of `\yii\console\Application::runAction()` (samdark)
- Bug: URL encoding for the route parameter added to `\yii\web\UrlManager` (klimov-paul) - Bug: URL encoding for the route parameter added to `\yii\web\UrlManager` (klimov-paul)
- Bug: Fixed the bug that requesting protected or private action methods would cause 500 error instead of 404 (qiangxue) - Bug: Fixed the bug that requesting protected or private action methods would cause 500 error instead of 404 (qiangxue)
......
...@@ -192,15 +192,19 @@ class BaseUrl ...@@ -192,15 +192,19 @@ class BaseUrl
if ($url === '') { if ($url === '') {
$url = Yii::$app->getRequest()->getUrl(); $url = Yii::$app->getRequest()->getUrl();
} elseif ($url[0] !== '/' && $url[0] !== '#' && $url[0] !== '.' && strpos($url, '://') === false) { } else {
$hasScheme = ($pos = strpos($url, ':')) > 0 && ctype_alpha(substr($url, 0, $pos));
$char = $url[0];
if ($char !== '/' && $char !== '#' && $char !== '.' && !$hasScheme) {
$url = Yii::$app->getRequest()->getBaseUrl() . '/' . $url; $url = Yii::$app->getRequest()->getBaseUrl() . '/' . $url;
} }
}
if ($scheme) { if ($scheme) {
if (strpos($url, '://') === false) { if (empty($hasScheme)) {
$url = Yii::$app->getRequest()->getHostInfo() . '/' . ltrim($url, '/'); $url = Yii::$app->getRequest()->getHostInfo() . '/' . ltrim($url, '/');
} }
if (is_string($scheme) && ($pos = strpos($url, '://')) !== false) { if (is_string($scheme) && ($pos = strpos($url, ':')) !== false) {
$url = $scheme . substr($url, $pos); $url = $scheme . substr($url, $pos);
} }
} }
......
...@@ -115,6 +115,14 @@ class UrlTest extends TestCase ...@@ -115,6 +115,14 @@ class UrlTest extends TestCase
\Yii::setAlias('@web4', '/test'); \Yii::setAlias('@web4', '/test');
\Yii::setAlias('@web5', '#test'); \Yii::setAlias('@web5', '#test');
$this->assertEquals('/base/test/me1', Url::to('test/me1'));
$this->assertEquals('javascript:test/me1', Url::to('javascript:test/me1'));
$this->assertEquals('/base/java/script:test/me1', Url::to('java/script:test/me1'));
$this->assertEquals('#test/me1', Url::to('#test/me1'));
$this->assertEquals('.test/me1', Url::to('.test/me1'));
$this->assertEquals('http://example.com/base/test/me1', Url::to('test/me1', true));
$this->assertEquals('https://example.com/base/test/me1', Url::to('test/me1', 'https'));
$this->assertEquals('http://test.example.com/test/me1', Url::to('@web1')); $this->assertEquals('http://test.example.com/test/me1', Url::to('@web1'));
$this->assertEquals('http://test.example.com/test/me1', Url::to('@web1', true)); $this->assertEquals('http://test.example.com/test/me1', Url::to('@web1', true));
$this->assertEquals('https://test.example.com/test/me1', Url::to('@web1', 'https')); $this->assertEquals('https://test.example.com/test/me1', Url::to('@web1', 'https'));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment