Skip to content

Commit 6589e0e

Browse files
Merge pull request #61 from MetaFilter/57-post-urls-require-the-title-slug
Redirect to canonical subsite/slug for post
2 parents 2e12de6 + 4eb9563 commit 6589e0e

12 files changed

Lines changed: 38 additions & 16 deletions

File tree

app/Http/Controllers/Posts/PostController.php

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use App\Traits\PostTrait;
1717
use App\Traits\SubsiteTrait;
1818
use Illuminate\Contracts\View\View;
19+
use Illuminate\Http\RedirectResponse;
1920

2021
final class PostController extends BaseController
2122
{
@@ -42,11 +43,21 @@ public function index(): View
4243
]);
4344
}
4445

45-
public function show(Post $post): View
46+
public function show(Post $post, ?string $slug = null): View|RedirectResponse
4647
{
47-
$relatedPosts = $this->postRepository->getRelatedPosts($post);
48-
48+
// Check if the post belongs to the correct subsite
4949
$subdomain = $this->getSubdomain() === 'www' ? 'metafilter' : $this->getSubdomain();
50+
$postSubdomain = $post->subsite->subdomain === 'www' ? 'metafilter' : $post->subsite->subdomain;
51+
52+
// Redirect if subdomain or slug is incorrect
53+
if ($subdomain !== $postSubdomain || $slug !== $post->slug) {
54+
return redirect()->route($this->getShowPostRouteName($postSubdomain), [
55+
'post' => $post,
56+
'slug' => $post->slug,
57+
], 301);
58+
}
59+
60+
$relatedPosts = $this->postRepository->getRelatedPosts($post);
5061

5162
return view('posts.show', [
5263
'title' => $post->title,

app/Traits/SubsiteTrait.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,9 +157,9 @@ public function getPostIndexRouteName(): string
157157
};
158158
}
159159

160-
public function getShowPostRouteName(): string
160+
public function getShowPostRouteName(?string $subdomain = null): string
161161
{
162-
$subdomain = $this->getSubdomain();
162+
$subdomain ??= $this->getSubdomain();
163163

164164
return match ($subdomain) {
165165
'ask' => 'ask.posts.show',

routes/subdomains/ask.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@
3333
Route::get('', 'index')
3434
->name('ask.posts.index');
3535

36-
Route::get('{post}/{slug}', 'show')
36+
Route::get('{post}/{slug?}', 'show')
37+
->whereNumber('post')
3738
->name('ask.posts.show');
3839

3940
Route::middleware('auth')->group(function () {

routes/subdomains/bestof.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
Route::get('', 'index')
1010
->name('bestof.posts.index');
1111

12-
Route::get('{post}/{slug}', 'show')
12+
Route::get('{post}/{slug?}', 'show')
13+
->whereNumber('post')
1314
->name('bestof.posts.show');
1415
});

routes/subdomains/fanfare.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@
3333
Route::get('', 'index')
3434
->name('fanfare.posts.index');
3535

36-
Route::get('{post}/{slug}', 'show')
36+
Route::get('{post}/{slug?}', 'show')
37+
->whereNumber('post')
3738
->name('fanfare.posts.show');
3839

3940
Route::middleware('auth')->group(function () {

routes/subdomains/irl.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
Route::get('', 'index')
1616
->name(RouteNameEnum::IrlMyPostsIndex);
1717

18-
Route::get('{post}/{slug}', 'show')
18+
Route::get('{post}/{slug?}', 'show')
19+
->whereNumber('post')
1920
->name(RouteNameEnum::IrlMyPostsShow);
2021
});
2122
});
@@ -33,7 +34,8 @@
3334
Route::get('', 'index')
3435
->name('irl.posts.index');
3536

36-
Route::get('{post}/{slug}', 'show')
37+
Route::get('{post}/{slug?}', 'show')
38+
->whereNumber('post')
3739
->name('irl.posts.show');
3840

3941
Route::middleware('auth')->group(function () {

routes/subdomains/jobs.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@
2525
Route::get('', 'index')
2626
->name('jobs.posts.index');
2727

28-
Route::get('{post}/{slug}', 'show')
28+
Route::get('{post}/{slug?}', 'show')
29+
->whereNumber('post')
2930
->name('jobs.posts.show');
3031

3132
Route::middleware('auth')->group(function () {

routes/subdomains/metafilter.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,8 @@
122122
Route::get('', 'index')
123123
->name('metafilter.posts.index');
124124

125-
Route::get('{post}/{slug}', 'show')
125+
Route::get('{post}/{slug?}', 'show')
126+
->whereNumber('post')
126127
->name('metafilter.posts.show');
127128

128129
Route::middleware('auth')->group(function () {

routes/subdomains/metatalk.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@
3535
Route::get('', 'index')
3636
->name('metatalk.posts.index');
3737

38-
Route::get('{post}/{slug}', 'show')
38+
Route::get('{post}/{slug?}', 'show')
39+
->whereNumber('post')
3940
->name('metatalk.posts.show');
4041

4142
Route::middleware('auth')->group(function () {

routes/subdomains/music.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@
3636
Route::get('', 'index')
3737
->name('music.posts.index');
3838

39-
Route::get('{post}/{slug}', 'show')
39+
Route::get('{post}/{slug?}', 'show')
40+
->whereNumber('post')
4041
->name('music.posts.show');
4142

4243
Route::middleware('auth')->group(function () {

0 commit comments

Comments
 (0)