diff --git a/packages/gatsby-plugin-nginx/src/headers.ts b/packages/gatsby-plugin-nginx/src/headers.ts index 82dd2b5577..aac853bb65 100644 --- a/packages/gatsby-plugin-nginx/src/headers.ts +++ b/packages/gatsby-plugin-nginx/src/headers.ts @@ -64,7 +64,7 @@ function cacheHeadersByPath(pages: Page[], manifest: Manifest): PathHeadersMap { } // removes trailing slash if possible -function normalizePath(path: string) { +export function normalizePath(path: string) { if (!path.endsWith('/') || path === '/') { return path } diff --git a/packages/gatsby-plugin-nginx/src/nginx-generator.ts b/packages/gatsby-plugin-nginx/src/nginx-generator.ts index 5575bcc600..3626ff3050 100644 --- a/packages/gatsby-plugin-nginx/src/nginx-generator.ts +++ b/packages/gatsby-plugin-nginx/src/nginx-generator.ts @@ -1,6 +1,7 @@ import { posix } from 'path' import { INDEX_HTML, LOCATION_MODIFIERS } from './constants' +import { normalizePath } from './headers' export { stringify, @@ -205,7 +206,9 @@ export function convertToRegExp(path: string) { .replace(wildcard, '(.*)') // replace * with (.*) .replace(namedSegment, '([^/]+)') // replace :param like with url component like regex ([^/]+) - return `^${converted}$` + const noTrailingSlashes = normalizePath(converted) + + return `^${noTrailingSlashes}$` } function isRegExpMatch(path: string) { diff --git a/packages/gatsby-plugin-nginx/test/nginx-generator.test.ts b/packages/gatsby-plugin-nginx/test/nginx-generator.test.ts index 59e5573b50..9507478c7f 100644 --- a/packages/gatsby-plugin-nginx/test/nginx-generator.test.ts +++ b/packages/gatsby-plugin-nginx/test/nginx-generator.test.ts @@ -56,6 +56,7 @@ describe('convert Gatsby paths into nginx RegExp', () => { it('handles wildcard (*)', () => { expect(convertToRegExp('/*')).toEqual('^/(.*)$') + expect(convertToRegExp('/*/')).toEqual('^/(.*)$') expect(convertToRegExp('/pt/*')).toEqual('^/pt/(.*)$') }) })