The Journal

Force a Default Locale Sub-Folder with Next.js

Learn how to enforce a consistent URL structure where the default locale always includes an explicit path segment in Next.js.

Mutual
Written by
Mutual
Next.js Published 25 Apr 2021 1 min read

Next.js has built-in i18n routing, but the default locale ends up served from two URLs. If en-GB is the default, the same page is live at both yourwebsite.com and yourwebsite.com/en-GB.

The problem

Canonical tags cover the SEO angle, but sometimes you want a single, consistent URL structure where every locale — including the default — has its own path segment.

A catch-all redirect

Define a pseudo-locale called catchAll, set it as the default, then redirect everything hitting it to the locale you actually want:

// next.config.js
module.exports = {
  i18n: {
    locales: ['en-GB', 'fr', 'catchAll'],
    defaultLocale: 'catchAll',
  },
  async redirects() {
    return [
      {
        source: '/catchAll',
        destination: '/en-GB',
        locale: false,
        permanent: false,
      },
      {
        source: '/catchAll/:slug*',
        destination: '/en-GB/:slug*',
        locale: false,
        permanent: false,
      },
    ]
  },
}

Every visitor ends up on yourwebsite.com/en-GB, not the root. Not pretty internally, but the URLs are consistent.

More from The Journal