From eb245dfab5c1861a379d5077b8f40be16b7fe9a1 Mon Sep 17 00:00:00 2001 From: illiakovalenko Date: Thu, 20 Jul 2023 11:20:22 +0300 Subject: [PATCH 1/3] [sitecore-jss-nexjts] Redirects don't work when file extensions present in route --- .../nextjs-sxa/src/lib/middleware/plugins/redirects.ts | 2 +- .../src/templates/nextjs/src/middleware.ts | 3 +-- .../sitecore-jss-nextjs/src/middleware/middleware.test.ts | 1 - packages/sitecore-jss-nextjs/src/middleware/middleware.ts | 1 - .../src/middleware/multisite-middleware.ts | 5 +++++ .../src/middleware/personalize-middleware.ts | 5 +++++ .../src/middleware/redirects-middleware.test.ts | 2 -- 7 files changed, 12 insertions(+), 7 deletions(-) diff --git a/packages/create-sitecore-jss/src/templates/nextjs-sxa/src/lib/middleware/plugins/redirects.ts b/packages/create-sitecore-jss/src/templates/nextjs-sxa/src/lib/middleware/plugins/redirects.ts index 825bcc434d..6bbbe3e608 100644 --- a/packages/create-sitecore-jss/src/templates/nextjs-sxa/src/lib/middleware/plugins/redirects.ts +++ b/packages/create-sitecore-jss/src/templates/nextjs-sxa/src/lib/middleware/plugins/redirects.ts @@ -18,7 +18,7 @@ class RedirectsPlugin implements MiddlewarePlugin { // This function determines if a route should be excluded from RedirectsMiddleware. // Certain paths are ignored by default (e.g. files and Next.js API routes), but you may wish to exclude more. // This is an important performance consideration since Next.js Edge middleware runs on every request. - excludeRoute: () => false, + excludeRoute: (pathname) => pathname.includes('.'), // This function determines if the middleware should be turned off. // By default it is disabled while in development mode. disabled: () => process.env.NODE_ENV === 'development', diff --git a/packages/create-sitecore-jss/src/templates/nextjs/src/middleware.ts b/packages/create-sitecore-jss/src/templates/nextjs/src/middleware.ts index 667e539b86..511cd6c67a 100644 --- a/packages/create-sitecore-jss/src/templates/nextjs/src/middleware.ts +++ b/packages/create-sitecore-jss/src/templates/nextjs/src/middleware.ts @@ -14,7 +14,6 @@ export const config = { * 3. /sitecore/api (Sitecore API routes) * 4. /- (Sitecore media) * 5. /healthz (Health check) - * 6. all root files inside /public (e.g. /favicon.ico) */ - matcher: ['/', '/((?!api/|_next/|healthz|sitecore/api/|-/|[\\w-]+\\.\\w+).*)'], + matcher: ['/', '/((?!api/|_next/|healthz|sitecore/api/|-/).*)'], }; diff --git a/packages/sitecore-jss-nextjs/src/middleware/middleware.test.ts b/packages/sitecore-jss-nextjs/src/middleware/middleware.test.ts index a975c7076d..218e21c537 100644 --- a/packages/sitecore-jss-nextjs/src/middleware/middleware.test.ts +++ b/packages/sitecore-jss-nextjs/src/middleware/middleware.test.ts @@ -113,7 +113,6 @@ describe('MiddlewareBase', () => { it('default', () => { const middleware = new SampleMiddleware({ siteResolver: new MockSiteResolver([]) }); - expect(middleware['excludeRoute']('/src/image.png')).to.equal(true); expect(middleware['excludeRoute']('/api/layout/render')).to.equal(true); expect(middleware['excludeRoute']('/sitecore/render')).to.equal(true); expect(middleware['excludeRoute']('/_next/webpack')).to.equal(true); diff --git a/packages/sitecore-jss-nextjs/src/middleware/middleware.ts b/packages/sitecore-jss-nextjs/src/middleware/middleware.ts index faf0c91c48..35637f5406 100644 --- a/packages/sitecore-jss-nextjs/src/middleware/middleware.ts +++ b/packages/sitecore-jss-nextjs/src/middleware/middleware.ts @@ -48,7 +48,6 @@ export abstract class MiddlewareBase { protected excludeRoute(pathname: string) { return ( - pathname.includes('.') || // Ignore files pathname.startsWith('/api/') || // Ignore Next.js API calls pathname.startsWith('/sitecore/') || // Ignore Sitecore API calls pathname.startsWith('/_next') || // Ignore next service calls diff --git a/packages/sitecore-jss-nextjs/src/middleware/multisite-middleware.ts b/packages/sitecore-jss-nextjs/src/middleware/multisite-middleware.ts index 69510af259..75666db6b5 100644 --- a/packages/sitecore-jss-nextjs/src/middleware/multisite-middleware.ts +++ b/packages/sitecore-jss-nextjs/src/middleware/multisite-middleware.ts @@ -37,6 +37,11 @@ export class MultisiteMiddleware extends MiddlewareBase { }; } + protected excludeRoute(pathname: string): boolean | undefined { + // ignore files + return pathname.includes('.') || super.excludeRoute(pathname); + } + private handler = async (req: NextRequest, res?: NextResponse): Promise => { const pathname = req.nextUrl.pathname; const language = this.getLanguage(req); diff --git a/packages/sitecore-jss-nextjs/src/middleware/personalize-middleware.ts b/packages/sitecore-jss-nextjs/src/middleware/personalize-middleware.ts index 8975e2afe5..2bd332aefc 100644 --- a/packages/sitecore-jss-nextjs/src/middleware/personalize-middleware.ts +++ b/packages/sitecore-jss-nextjs/src/middleware/personalize-middleware.ts @@ -115,6 +115,11 @@ export class PersonalizeMiddleware extends MiddlewareBase { }; } + protected excludeRoute(pathname: string): boolean | undefined { + // ignore files + return pathname.includes('.') || super.excludeRoute(pathname); + } + private handler = async (req: NextRequest, res?: NextResponse): Promise => { const pathname = req.nextUrl.pathname; const language = this.getLanguage(req); diff --git a/packages/sitecore-jss-nextjs/src/middleware/redirects-middleware.test.ts b/packages/sitecore-jss-nextjs/src/middleware/redirects-middleware.test.ts index 6ac1819fec..794ffb8fb9 100644 --- a/packages/sitecore-jss-nextjs/src/middleware/redirects-middleware.test.ts +++ b/packages/sitecore-jss-nextjs/src/middleware/redirects-middleware.test.ts @@ -259,7 +259,6 @@ describe('RedirectsMiddleware', () => { it('default', async () => { const { middleware } = createMiddleware(); - await test('/src/image.png', middleware); await test('/api/layout/render', middleware); await test('/sitecore/render', middleware); await test('/_next/webpack', middleware); @@ -272,7 +271,6 @@ describe('RedirectsMiddleware', () => { excludeRoute, }); - await test('/src/image.png', middleware); await test('/api/layout/render', middleware); await test('/sitecore/render', middleware); await test('/_next/webpack', middleware); From dd54cc099a8acb631981b3a9c5cbea318571f989 Mon Sep 17 00:00:00 2001 From: illiakovalenko Date: Thu, 20 Jul 2023 11:32:26 +0300 Subject: [PATCH 2/3] Updated CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e7c2c00f8..f7f04a14b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ Our versioning strategy is as follows: ### 🐛 Bug Fixes +* `[tempaltes/nextjs]` `[templates/nextjs-sxa]` `[sitecore-jss-nexjts]` Redirects don't work when file extensions present in a route ([#1566](https://github.com/Sitecore/jss/pull/1566)) * `[templates/vue]` "lint" command is failing due to bug introduced by eslint-plugin-prettier ([#1563](https://github.com/Sitecore/jss/pull/1563)) * `[templates/nextjs-sxa]` Fix font awesome - added CDN instead of using node_modules(problem with CORS) ([#1536](https://github.com/Sitecore/jss/pull/1536) ([#1545](https://github.com/Sitecore/jss/pull/1545)) * `[templates/nextjs-sxa]` Fix menu component of third-level menu. ([#1540](https://github.com/Sitecore/jss/pull/1540)) ([#1546](https://github.com/Sitecore/jss/pull/1546)) From 6d963ebd47d22abb9c77de246427f4f549545cf2 Mon Sep 17 00:00:00 2001 From: illiakovalenko Date: Thu, 20 Jul 2023 16:37:46 +0300 Subject: [PATCH 3/3] Applied changes according to review comments --- .../nextjs-sxa/src/lib/middleware/plugins/redirects.ts | 4 ++-- .../src/templates/nextjs/src/middleware.ts | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/create-sitecore-jss/src/templates/nextjs-sxa/src/lib/middleware/plugins/redirects.ts b/packages/create-sitecore-jss/src/templates/nextjs-sxa/src/lib/middleware/plugins/redirects.ts index 6bbbe3e608..c1333ea780 100644 --- a/packages/create-sitecore-jss/src/templates/nextjs-sxa/src/lib/middleware/plugins/redirects.ts +++ b/packages/create-sitecore-jss/src/templates/nextjs-sxa/src/lib/middleware/plugins/redirects.ts @@ -16,9 +16,9 @@ class RedirectsPlugin implements MiddlewarePlugin { // These should match those in your next.config.js (i18n.locales). locales: ['en'], // This function determines if a route should be excluded from RedirectsMiddleware. - // Certain paths are ignored by default (e.g. files and Next.js API routes), but you may wish to exclude more. + // Certain paths are ignored by default (e.g. Next.js API routes), but you may wish to exclude more. // This is an important performance consideration since Next.js Edge middleware runs on every request. - excludeRoute: (pathname) => pathname.includes('.'), + excludeRoute: () => false, // This function determines if the middleware should be turned off. // By default it is disabled while in development mode. disabled: () => process.env.NODE_ENV === 'development', diff --git a/packages/create-sitecore-jss/src/templates/nextjs/src/middleware.ts b/packages/create-sitecore-jss/src/templates/nextjs/src/middleware.ts index 511cd6c67a..21f26c038a 100644 --- a/packages/create-sitecore-jss/src/templates/nextjs/src/middleware.ts +++ b/packages/create-sitecore-jss/src/templates/nextjs/src/middleware.ts @@ -14,6 +14,7 @@ export const config = { * 3. /sitecore/api (Sitecore API routes) * 4. /- (Sitecore media) * 5. /healthz (Health check) + * 6. all root files inside /public */ - matcher: ['/', '/((?!api/|_next/|healthz|sitecore/api/|-/).*)'], + matcher: ['/', '/((?!api/|_next/|healthz|sitecore/api/|-/|favicon.ico|sc_logo.svg).*)'], };