feat: add trailingSlash middleware
This commit is contained in:
@@ -22,8 +22,9 @@ export default async (req: Request) => {
|
|||||||
data.shift();
|
data.shift();
|
||||||
}
|
}
|
||||||
data.push(chunk.toString());
|
data.push(chunk.toString());
|
||||||
|
// Since we strip trailing slash (in the trailingSlash middleware) before entering this middleware,
|
||||||
const re = new RegExp(`"${body.pathname}":"([^"]+)"`);
|
// we need check matching paths both including and excluding trailing slash.
|
||||||
|
const re = new RegExp(`"${body.pathname}\/?":"([^"]+)"`);
|
||||||
|
|
||||||
const match = data.join("").match(re);
|
const match = data.join("").match(re);
|
||||||
if (match?.[1]) {
|
if (match?.[1]) {
|
||||||
@@ -46,10 +47,14 @@ export default async (req: Request) => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (redirectUrl) {
|
if (redirectUrl) {
|
||||||
if (redirectUrl === body.pathname) {
|
// Make sure to exclude trailing slash in the redirectUrl to avoid an extra middleware roundtrip
|
||||||
|
const redirectUrlWithoutTrailingSlash = redirectUrl.endsWith("/")
|
||||||
|
? redirectUrl.slice(0, -1)
|
||||||
|
: redirectUrl;
|
||||||
|
if (redirectUrlWithoutTrailingSlash === body.pathname) {
|
||||||
return new Response("Not Found", { status: 404 });
|
return new Response("Not Found", { status: 404 });
|
||||||
}
|
}
|
||||||
return new Response(redirectUrl);
|
return new Response(redirectUrlWithoutTrailingSlash);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return new Response("Not Found", { status: 404 });
|
return new Response("Not Found", { status: 404 });
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import * as handleAuth from "@/middlewares/handleAuth"
|
|||||||
import * as myPages from "@/middlewares/myPages"
|
import * as myPages from "@/middlewares/myPages"
|
||||||
import * as redirect from "@/middlewares/redirect"
|
import * as redirect from "@/middlewares/redirect"
|
||||||
import * as sasXScandic from "@/middlewares/sasXScandic"
|
import * as sasXScandic from "@/middlewares/sasXScandic"
|
||||||
|
import * as trailingSlash from "@/middlewares/trailingSlash"
|
||||||
import { getDefaultRequestHeaders } from "@/middlewares/utils"
|
import { getDefaultRequestHeaders } from "@/middlewares/utils"
|
||||||
import * as webView from "@/middlewares/webView"
|
import * as webView from "@/middlewares/webView"
|
||||||
import { findLang } from "@/utils/languages"
|
import { findLang } from "@/utils/languages"
|
||||||
@@ -49,6 +50,7 @@ export const middleware: NextMiddleware = async (request, event) => {
|
|||||||
|
|
||||||
// Note that the order of middlewares is important since that is the order they are matched by.
|
// Note that the order of middlewares is important since that is the order they are matched by.
|
||||||
const middlewares = [
|
const middlewares = [
|
||||||
|
trailingSlash,
|
||||||
currentWebLogin,
|
currentWebLogin,
|
||||||
currentWebLoginEmail,
|
currentWebLoginEmail,
|
||||||
currentWebLogout,
|
currentWebLogout,
|
||||||
|
|||||||
24
apps/scandic-web/middlewares/trailingSlash.ts
Normal file
24
apps/scandic-web/middlewares/trailingSlash.ts
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
import { type NextMiddleware, NextResponse } from "next/server"
|
||||||
|
|
||||||
|
import { getPublicNextURL } from "@/server/utils"
|
||||||
|
|
||||||
|
import { getDefaultRequestHeaders } from "./utils"
|
||||||
|
|
||||||
|
import type { MiddlewareMatcher } from "@/types/middleware"
|
||||||
|
|
||||||
|
export const middleware: NextMiddleware = async (request) => {
|
||||||
|
const headers = getDefaultRequestHeaders(request)
|
||||||
|
|
||||||
|
const newUrl = new URL(
|
||||||
|
request.nextUrl.pathname.slice(0, -1),
|
||||||
|
getPublicNextURL(request)
|
||||||
|
)
|
||||||
|
|
||||||
|
return NextResponse.redirect(newUrl, {
|
||||||
|
headers,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export const matcher: MiddlewareMatcher = (request) => {
|
||||||
|
return request.nextUrl.pathname.endsWith("/")
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user