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, ]; 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); + } +}