From 819ed7e945cd20ee5d53700199677fdc25a06397 Mon Sep 17 00:00:00 2001 From: oopen Date: Wed, 8 Oct 2025 10:48:20 +0000 Subject: [PATCH 1/2] Update Kernel.php --- app/Http/Kernel.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 00bf8cbe1c5..3cb2faac6ee 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -17,6 +17,7 @@ class Kernel extends HttpKernel \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, \BookStack\Http\Middleware\TrimStrings::class, \BookStack\Http\Middleware\TrustProxies::class, + \BookStack\Http\Middleware\RedirectOldPageSlugs::class, \BookStack\Http\Middleware\PreventResponseCaching::class, ]; From 380b5e0aed143ade342a204313151dd895fd322c Mon Sep 17 00:00:00 2001 From: oopen Date: Wed, 8 Oct 2025 10:51:05 +0000 Subject: [PATCH 2/2] Create RedirectOldPageSlugs.php Restores broken links automatically. Improves SEO by preserving link equity via 301s. Requires no user intervention or configuration. Minimal performance impact (indexed DB lookup on page_revisions.slug). --- app/Http/Middleware/RedirectOldPageSlugs.php | 41 ++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 app/Http/Middleware/RedirectOldPageSlugs.php diff --git a/app/Http/Middleware/RedirectOldPageSlugs.php b/app/Http/Middleware/RedirectOldPageSlugs.php new file mode 100644 index 00000000000..c4f7190d3bd --- /dev/null +++ b/app/Http/Middleware/RedirectOldPageSlugs.php @@ -0,0 +1,41 @@ +is('api/*', 'assets/*', 'dist/*', 'uploads/*', '_debugbar/*', 'link/*', 'saml2/*')) { + return $next($request); + } + + $path = trim($request->path(), '/'); + if (empty($path)) { + return $next($request); + } + + // Extract last path segment (potential page slug) + $segments = explode('/', $path); + $lastSegment = end($segments); + + // Look for this slug in page revisions (only if it's not the current slug) + $revision = PageRevision::where('slug', $lastSegment) + ->whereHas('page', function ($query) use ($lastSegment) { + $query->where('slug', '!=', $lastSegment); + }) + ->first(); + + if ($revision) { + // Redirect to stable permalink: /link/{page_id} + return redirect('/link/' . $revision->page_id, 301); + } + + return $next($request); + } +}