diff --git a/packages/next/build/webpack/loaders/next-serverless-loader/utils.ts b/packages/next/build/webpack/loaders/next-serverless-loader/utils.ts index b8f7fdb4f14ad..8845ddc110b7d 100644 --- a/packages/next/build/webpack/loaders/next-serverless-loader/utils.ts +++ b/packages/next/build/webpack/loaders/next-serverless-loader/utils.ts @@ -351,10 +351,15 @@ export function getUtils({ let defaultLocale = i18n.defaultLocale let detectedLocale = detectLocaleCookie(req, i18n.locales) - let acceptPreferredLocale = - i18n.localeDetection !== false - ? accept.language(req.headers['accept-language'], i18n.locales) - : detectedLocale + let acceptPreferredLocale + try { + acceptPreferredLocale = + i18n.localeDetection !== false + ? accept.language(req.headers['accept-language'], i18n.locales) + : detectedLocale + } catch (_) { + acceptPreferredLocale = detectedLocale + } const { host } = req.headers || {} // remove port from host and remove port if present diff --git a/packages/next/next-server/server/next-server.ts b/packages/next/next-server/server/next-server.ts index 885937ea74b58..54594d035482e 100644 --- a/packages/next/next-server/server/next-server.ts +++ b/packages/next/next-server/server/next-server.ts @@ -427,11 +427,15 @@ export default class Server { let defaultLocale = i18n.defaultLocale let detectedLocale = detectLocaleCookie(req, i18n.locales) - let acceptPreferredLocale = - i18n.localeDetection !== false - ? accept.language(req.headers['accept-language'], i18n.locales) - : detectedLocale - + let acceptPreferredLocale + try { + acceptPreferredLocale = + i18n.localeDetection !== false + ? accept.language(req.headers['accept-language'], i18n.locales) + : detectedLocale + } catch (_) { + acceptPreferredLocale = detectedLocale + } const { host } = req?.headers || {} // remove port from host if present const hostname = host?.split(':')[0].toLowerCase() diff --git a/test/integration/i18n-support/test/index.test.js b/test/integration/i18n-support/test/index.test.js index 480c28d707130..ea82869ec6c74 100644 --- a/test/integration/i18n-support/test/index.test.js +++ b/test/integration/i18n-support/test/index.test.js @@ -267,6 +267,28 @@ describe('i18n Support', () => { expect($('#router-as-path').text()).toBe('/') }) + it('should ignore the invalid accept-language header', async () => { + nextConfig.replace('localeDetection: false', 'localeDetection: true') + const res = await fetchViaHTTP( + ctx.appPort, + '/', + {}, + { + headers: { + 'accept-language': 'ldfir;', + }, + } + ) + + expect(res.status).toBe(200) + const $ = cheerio.load(await res.text()) + expect($('html').attr('lang')).toBe('en-US') + expect($('#router-locale').text()).toBe('en-US') + expect(JSON.parse($('#router-locales').text())).toEqual(locales) + expect($('#router-pathname').text()).toBe('/') + expect($('#router-as-path').text()).toBe('/') + }) + it('should set locale from detected path', async () => { for (const locale of nonDomainLocales) { const res = await fetchViaHTTP(