Force a Default Locale Sub-Folder with Next.js
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 blog
The Best Craft CMS Learning Resources in 2026
Where we'd send a developer learning Craft CMS in 2026: the official docs and tutorial, CraftQuest, the Discord, the newsletter and the conference talks.
How design and brand agencies can use Craft CMS to say "yes" to more briefs
We work with design and brand agencies as their development partner, helping them say "yes" to more briefs.
Common Accessibility Problems to Avoid in 2026
The accessibility problems we still see most often, what WCAG 2.2 and the European Accessibility Act changed, and how to catch what automated tools miss.