diff --git a/typo3/sysext/frontend/Classes/Middleware/SiteBaseRedirectResolver.php b/typo3/sysext/frontend/Classes/Middleware/SiteBaseRedirectResolver.php index 8a89cd474cb232de5b782abcc891b18ff7d984c9..825dd95d61058b15a2ddf0fe6ed5e4cf189771ca 100644 --- a/typo3/sysext/frontend/Classes/Middleware/SiteBaseRedirectResolver.php +++ b/typo3/sysext/frontend/Classes/Middleware/SiteBaseRedirectResolver.php @@ -58,7 +58,13 @@ class SiteBaseRedirectResolver implements MiddlewareInterface if ($site instanceof Site && !($language instanceof SiteLanguage)) { if ($routeResult instanceof SiteRouteResult && $routeResult->getTail() === '') { $language = $site->getDefaultLanguage(); - return new RedirectResponse($language->getBase(), 307); + if ($language->isEnabled()) { + return new RedirectResponse($language->getBase(), 307); + } + // Default language is disabled, check for the first (enabled) language in list to redirect to that + foreach ($site->getLanguages() as $language) { + return new RedirectResponse($language->getBase(), 307); + } } return GeneralUtility::makeInstance(ErrorController::class)->pageNotFoundAction( $request, diff --git a/typo3/sysext/frontend/Tests/Unit/Middleware/SiteBaseRedirectResolverTest.php b/typo3/sysext/frontend/Tests/Unit/Middleware/SiteBaseRedirectResolverTest.php index 50d7385f8c2de71d585804837c4e7536476f7c05..b05636722ce46a81e752425b6fba99a0e763076f 100644 --- a/typo3/sysext/frontend/Tests/Unit/Middleware/SiteBaseRedirectResolverTest.php +++ b/typo3/sysext/frontend/Tests/Unit/Middleware/SiteBaseRedirectResolverTest.php @@ -301,4 +301,80 @@ class SiteBaseRedirectResolverTest extends UnitTestCase $response = $subject->process($request, $this->siteFoundRequestHandler); self::assertEquals(200, $response->getStatusCode()); } + + /** + * @test + */ + public function useDefaultLanguageIfNoLanguageIsGiven(): void + { + $incomingUrl = 'https://twenty.one/'; + $site = new Site('random-site', 13, [ + 'base' => 'https://twenty.one/', + 'languages' => [ + 0 => [ + 'languageId' => 0, + 'locale' => 'en_US.UTF-8', + 'base' => '/en/' + ], + 1 => [ + 'languageId' => 1, + 'locale' => 'fr_FR.UTF-8', + 'base' => '/fr' + ], + 2 => [ + 'languageId' => 2, + 'locale' => 'fr_CA.UTF-8', + 'base' => '/fr_ca' + ] + ] + ]); + + $routeResult = new SiteRouteResult(new Uri($incomingUrl), $site); + $request = new ServerRequest($incomingUrl, 'GET'); + $request = $request->withAttribute('site', $site); + $request = $request->withAttribute('routing', $routeResult); + + $subject = new SiteBaseRedirectResolver(); + $response = $subject->process($request, $this->siteFoundRequestHandler); + self::assertEquals('https://twenty.one/en/', $response->getHeader('Location')[0]); + } + + /** + * @test + */ + public function useFirstAvailableLanguageIfDefaultLanguageIsNotEnabledAndLanguageIsGiven(): void + { + $incomingUrl = 'https://twenty.one/'; + $site = new Site('random-site', 13, [ + 'base' => 'https://twenty.one/', + 'languages' => [ + 0 => [ + 'languageId' => 0, + 'enabled' => false, + 'locale' => 'en_US.UTF-8', + 'base' => '/en/' + ], + 1 => [ + 'languageId' => 1, + 'enabled' => false, + 'locale' => 'fr_FR.UTF-8', + 'base' => '/fr' + ], + 2 => [ + 'languageId' => 2, + 'locale' => 'fr_CA.UTF-8', + 'base' => '/fr_ca' + ] + ] + ]); + + $routeResult = new SiteRouteResult(new Uri($incomingUrl), $site); + $request = new ServerRequest($incomingUrl, 'GET'); + $request = $request->withAttribute('site', $site); + $request = $request->withAttribute('routing', $routeResult); + + $subject = new SiteBaseRedirectResolver(); + $response = $subject->process($request, $this->siteFoundRequestHandler); + self::assertEquals('https://twenty.one/fr_ca', $response->getHeader('Location')[0]); + } }