From b9ee89fc466f09288be365af9be6ccc4ec12c880 Mon Sep 17 00:00:00 2001 From: Robert Sese Date: Thu, 5 Aug 2021 16:46:57 -0500 Subject: [PATCH] Add redirects for language-less homepage requests (#20494) * Redirect homepage to user's language * Redirect URLs with no language code * Add leading forward slash * Revert "Redirect URLs with no language code" This reverts commit f817ac1136ea0c7e11c4d61327a4445b56a2f5d6. * Simplify per @zeke * Add homepage language redirect tests * Update middleware/redirects/handle-redirects.js Co-authored-by: Kevin Heis * braces are good Co-authored-by: Kevin Heis --- middleware/redirects/handle-redirects.js | 16 ++++++++++++++-- tests/routing/redirects.js | 14 ++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/middleware/redirects/handle-redirects.js b/middleware/redirects/handle-redirects.js index 503aab1bdd..94e1996c7f 100644 --- a/middleware/redirects/handle-redirects.js +++ b/middleware/redirects/handle-redirects.js @@ -1,13 +1,25 @@ import patterns from '../../lib/patterns.js' import { URL } from 'url' +import languages from '../../lib/languages.js' export default function handleRedirects(req, res, next) { // never redirect assets if (patterns.assetPaths.test(req.path)) return next() - // blanket redirects for languageless homepage to English homepage + // blanket redirects for languageless homepage if (req.path === '/') { - return res.redirect(301, '/en') + let language = 'en' + + // if set, redirect to user's preferred language translation or else English + if ( + req.context.userLanguage && + languages[req.context.userLanguage] && + !languages[req.context.userLanguage].wip + ) { + language = req.context.userLanguage + } + + return res.redirect(301, `/${language}`) } // begin redirect handling diff --git a/tests/routing/redirects.js b/tests/routing/redirects.js index 5d8b7efa85..3acdd51304 100644 --- a/tests/routing/redirects.js +++ b/tests/routing/redirects.js @@ -119,6 +119,20 @@ describe('redirects', () => { }) }) + describe('home page redirects', () => { + test('homepage redirects to english by default', async () => { + const res = await get('/') + expect(res.statusCode).toBe(301) + expect(res.headers.location).toBe('/en') + }) + + test('homepage redirects to preferred language', async () => { + const res = await get('/', { headers: { 'Accept-Language': 'ja' } }) + expect(res.statusCode).toBe(301) + expect(res.headers.location).toBe('/ja') + }) + }) + describe('external redirects', () => { test('work for top-level request paths', async () => { const res = await get('/git-ready')