Skip to content

Commit 6a7fd1e

Browse files
authored
Merge pull request #8191 from kenjis/fix-force_https
fix: force_https() redirects to wrong URL when baseURL has subfolder
2 parents 2021c36 + d59fdaa commit 6a7fd1e

File tree

2 files changed

+22
-18
lines changed

2 files changed

+22
-18
lines changed

system/Common.php

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -502,27 +502,11 @@ function force_https(
502502
Services::session()->regenerate(); // @codeCoverageIgnore
503503
}
504504

505-
$baseURL = config(App::class)->baseURL;
506-
507-
if (strpos($baseURL, 'https://') === 0) {
508-
$authority = substr($baseURL, strlen('https://'));
509-
} elseif (strpos($baseURL, 'http://') === 0) {
510-
$authority = substr($baseURL, strlen('http://'));
511-
} else {
512-
$authority = $baseURL;
513-
}
514-
515-
$uri = URI::createURIString(
516-
'https',
517-
$authority,
518-
$request->getUri()->getPath(), // Absolute URIs should use a "/" for an empty path
519-
$request->getUri()->getQuery(),
520-
$request->getUri()->getFragment()
521-
);
505+
$uri = $request->getUri()->withScheme('https');
522506

523507
// Set an HSTS header
524508
$response->setHeader('Strict-Transport-Security', 'max-age=' . $duration)
525-
->redirect($uri)
509+
->redirect((string) $uri)
526510
->setStatusCode(307)
527511
->setBody('')
528512
->getCookieStore()

tests/system/CommonFunctionsTest.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -612,6 +612,7 @@ public function testViewNotSaveData(): void
612612
public function testForceHttpsNullRequestAndResponse(): void
613613
{
614614
$this->assertNull(Services::response()->header('Location'));
615+
615616
Services::response()->setCookie('force', 'cookie');
616617
Services::response()->setHeader('Force', 'header');
617618
Services::response()->setBody('default body');
@@ -634,6 +635,25 @@ public function testForceHttpsNullRequestAndResponse(): void
634635
force_https();
635636
}
636637

638+
public function testForceHttpsWithBaseUrlSubFolder(): void
639+
{
640+
$config = config(App::class);
641+
$config->baseURL = 'https://example.jp/codeIgniter/';
642+
$uri = new SiteURI($config, 'en/home?foo=bar');
643+
$request = new IncomingRequest($config, $uri, '', new UserAgent());
644+
Services::injectMock('request', $request);
645+
646+
try {
647+
force_https();
648+
} catch (Exception $e) {
649+
$this->assertInstanceOf(RedirectException::class, $e);
650+
$this->assertSame(
651+
'https://example.jp/codeIgniter/index.php/en/home?foo=bar',
652+
$e->getResponse()->header('Location')->getValue()
653+
);
654+
}
655+
}
656+
637657
/**
638658
* @dataProvider provideCleanPathActuallyCleaningThePaths
639659
*

0 commit comments

Comments
 (0)