From 4eb95638c860ccadf100f72d27071f4918cab5a4 Mon Sep 17 00:00:00 2001 From: William Rose Date: Sun, 29 Jun 2025 10:40:43 -0700 Subject: [PATCH] Redirect to canonical subsite/slug for post --- app/Http/Controllers/Posts/PostController.php | 17 ++++++++++++++--- app/Traits/SubsiteTrait.php | 4 ++-- routes/subdomains/ask.php | 3 ++- routes/subdomains/bestof.php | 3 ++- routes/subdomains/fanfare.php | 3 ++- routes/subdomains/irl.php | 6 ++++-- routes/subdomains/jobs.php | 3 ++- routes/subdomains/metafilter.php | 3 ++- routes/subdomains/metatalk.php | 3 ++- routes/subdomains/music.php | 3 ++- routes/subdomains/podcast.php | 3 ++- routes/subdomains/projects.php | 3 ++- 12 files changed, 38 insertions(+), 16 deletions(-) diff --git a/app/Http/Controllers/Posts/PostController.php b/app/Http/Controllers/Posts/PostController.php index 9d72798d..33d601d1 100644 --- a/app/Http/Controllers/Posts/PostController.php +++ b/app/Http/Controllers/Posts/PostController.php @@ -16,6 +16,7 @@ use App\Traits\PostTrait; use App\Traits\SubsiteTrait; use Illuminate\Contracts\View\View; +use Illuminate\Http\RedirectResponse; final class PostController extends BaseController { @@ -42,11 +43,21 @@ public function index(): View ]); } - public function show(Post $post): View + public function show(Post $post, ?string $slug = null): View|RedirectResponse { - $relatedPosts = $this->postRepository->getRelatedPosts($post); - + // Check if the post belongs to the correct subsite $subdomain = $this->getSubdomain() === 'www' ? 'metafilter' : $this->getSubdomain(); + $postSubdomain = $post->subsite->subdomain === 'www' ? 'metafilter' : $post->subsite->subdomain; + + // Redirect if subdomain or slug is incorrect + if ($subdomain !== $postSubdomain || $slug !== $post->slug) { + return redirect()->route($this->getShowPostRouteName($postSubdomain), [ + 'post' => $post, + 'slug' => $post->slug, + ], 301); + } + + $relatedPosts = $this->postRepository->getRelatedPosts($post); return view('posts.show', [ 'title' => $post->title, diff --git a/app/Traits/SubsiteTrait.php b/app/Traits/SubsiteTrait.php index 148ed412..64022352 100644 --- a/app/Traits/SubsiteTrait.php +++ b/app/Traits/SubsiteTrait.php @@ -157,9 +157,9 @@ public function getPostIndexRouteName(): string }; } - public function getShowPostRouteName(): string + public function getShowPostRouteName(?string $subdomain = null): string { - $subdomain = $this->getSubdomain(); + $subdomain ??= $this->getSubdomain(); return match ($subdomain) { 'ask' => 'ask.posts.show', diff --git a/routes/subdomains/ask.php b/routes/subdomains/ask.php index f183caba..36ad5d41 100644 --- a/routes/subdomains/ask.php +++ b/routes/subdomains/ask.php @@ -33,7 +33,8 @@ Route::get('', 'index') ->name('ask.posts.index'); - Route::get('{post}/{slug}', 'show') + Route::get('{post}/{slug?}', 'show') + ->whereNumber('post') ->name('ask.posts.show'); Route::middleware('auth')->group(function () { diff --git a/routes/subdomains/bestof.php b/routes/subdomains/bestof.php index d8754ce1..d3899119 100644 --- a/routes/subdomains/bestof.php +++ b/routes/subdomains/bestof.php @@ -9,6 +9,7 @@ Route::get('', 'index') ->name('bestof.posts.index'); - Route::get('{post}/{slug}', 'show') + Route::get('{post}/{slug?}', 'show') + ->whereNumber('post') ->name('bestof.posts.show'); }); diff --git a/routes/subdomains/fanfare.php b/routes/subdomains/fanfare.php index d82bf8ea..cb65a3cb 100644 --- a/routes/subdomains/fanfare.php +++ b/routes/subdomains/fanfare.php @@ -33,7 +33,8 @@ Route::get('', 'index') ->name('fanfare.posts.index'); - Route::get('{post}/{slug}', 'show') + Route::get('{post}/{slug?}', 'show') + ->whereNumber('post') ->name('fanfare.posts.show'); Route::middleware('auth')->group(function () { diff --git a/routes/subdomains/irl.php b/routes/subdomains/irl.php index 6ceaa7ff..bb4707ae 100644 --- a/routes/subdomains/irl.php +++ b/routes/subdomains/irl.php @@ -15,7 +15,8 @@ Route::get('', 'index') ->name(RouteNameEnum::IrlMyPostsIndex); - Route::get('{post}/{slug}', 'show') + Route::get('{post}/{slug?}', 'show') + ->whereNumber('post') ->name(RouteNameEnum::IrlMyPostsShow); }); }); @@ -33,7 +34,8 @@ Route::get('', 'index') ->name('irl.posts.index'); - Route::get('{post}/{slug}', 'show') + Route::get('{post}/{slug?}', 'show') + ->whereNumber('post') ->name('irl.posts.show'); Route::middleware('auth')->group(function () { diff --git a/routes/subdomains/jobs.php b/routes/subdomains/jobs.php index 0d6113e1..e4ea8c63 100644 --- a/routes/subdomains/jobs.php +++ b/routes/subdomains/jobs.php @@ -25,7 +25,8 @@ Route::get('', 'index') ->name('jobs.posts.index'); - Route::get('{post}/{slug}', 'show') + Route::get('{post}/{slug?}', 'show') + ->whereNumber('post') ->name('jobs.posts.show'); Route::middleware('auth')->group(function () { diff --git a/routes/subdomains/metafilter.php b/routes/subdomains/metafilter.php index 2bc8d7df..f10b2517 100644 --- a/routes/subdomains/metafilter.php +++ b/routes/subdomains/metafilter.php @@ -122,7 +122,8 @@ Route::get('', 'index') ->name('metafilter.posts.index'); - Route::get('{post}/{slug}', 'show') + Route::get('{post}/{slug?}', 'show') + ->whereNumber('post') ->name('metafilter.posts.show'); Route::middleware('auth')->group(function () { diff --git a/routes/subdomains/metatalk.php b/routes/subdomains/metatalk.php index 9e5b37eb..a94508ab 100644 --- a/routes/subdomains/metatalk.php +++ b/routes/subdomains/metatalk.php @@ -35,7 +35,8 @@ Route::get('', 'index') ->name('metatalk.posts.index'); - Route::get('{post}/{slug}', 'show') + Route::get('{post}/{slug?}', 'show') + ->whereNumber('post') ->name('metatalk.posts.show'); Route::middleware('auth')->group(function () { diff --git a/routes/subdomains/music.php b/routes/subdomains/music.php index b4a4c486..b65972d3 100644 --- a/routes/subdomains/music.php +++ b/routes/subdomains/music.php @@ -36,7 +36,8 @@ Route::get('', 'index') ->name('music.posts.index'); - Route::get('{post}/{slug}', 'show') + Route::get('{post}/{slug?}', 'show') + ->whereNumber('post') ->name('music.posts.show'); Route::middleware('auth')->group(function () { diff --git a/routes/subdomains/podcast.php b/routes/subdomains/podcast.php index dbdeb9a0..c85d0257 100644 --- a/routes/subdomains/podcast.php +++ b/routes/subdomains/podcast.php @@ -31,7 +31,8 @@ Route::get('', 'index') ->name('podcast.posts.index'); - Route::get('{post}/{slug}', 'show') + Route::get('{post}/{slug?}', 'show') + ->whereNumber('post') ->name('podcast.posts.show'); Route::middleware('auth')->group(function () { diff --git a/routes/subdomains/projects.php b/routes/subdomains/projects.php index 4f186952..7d05fc34 100644 --- a/routes/subdomains/projects.php +++ b/routes/subdomains/projects.php @@ -22,7 +22,8 @@ Route::get('', 'index') ->name('projects.posts.index'); - Route::get('{post}/{slug}', 'show') + Route::get('{post}/{slug?}', 'show') + ->whereNumber('post') ->name('projects.posts.show'); Route::middleware('auth')->group(function () {