diff --git a/src/app/builders/[slug]/page.tsx b/src/app/builders/[slug]/page.tsx
index 97edea5..43600d3 100644
--- a/src/app/builders/[slug]/page.tsx
+++ b/src/app/builders/[slug]/page.tsx
@@ -1,4 +1,4 @@
-import { notFound } from "next/navigation";
+import { notFound, permanentRedirect } from "next/navigation";
import type { Metadata } from "next";
import Image from "next/image";
import Link from "next/link";
@@ -15,7 +15,7 @@ export async function generateMetadata({
return {
title: `${builder.name}: ${builder.tagline}`,
description: builder.quote ?? undefined,
- alternates: { canonical: `/builders/${slug}` },
+ alternates: { canonical: `/builders/${builder.slug}` },
openGraph: {
title: `${builder.name}: ${builder.tagline} | Build Canada`,
description: builder.quote ?? undefined,
@@ -41,6 +41,10 @@ export default async function BuilderPage({
notFound();
}
+ if (builder.slug !== slug) {
+ permanentRedirect(`/builders/${builder.slug}`);
+ }
+
return (
diff --git a/src/app/memos/[slug]/page.tsx b/src/app/memos/[slug]/page.tsx
index de905a7..9f15458 100644
--- a/src/app/memos/[slug]/page.tsx
+++ b/src/app/memos/[slug]/page.tsx
@@ -1,4 +1,4 @@
-import { notFound } from "next/navigation";
+import { notFound, permanentRedirect } from "next/navigation";
import type { Metadata } from "next";
import Image from "next/image";
import { fetchMemo, fetchMemos, getSiteConfig } from "@/lib/api";
@@ -42,7 +42,7 @@ export async function generateMetadata({
return {
title,
description,
- alternates: { canonical: `/memos/${slug}` },
+ alternates: { canonical: `/memos/${memo.slug}` },
openGraph: {
title,
description,
@@ -73,6 +73,10 @@ export default async function MemoDetailPage({
notFound();
}
+ if (memo.slug !== slug) {
+ permanentRedirect(`/memos/${memo.slug}`);
+ }
+
const authorImage =
memo.author.name === "Build Canada"
? "/assets/logos/buildcanada-logo-square.svg"
diff --git a/src/app/posts/[slug]/page.tsx b/src/app/posts/[slug]/page.tsx
index 583b27f..1b472a4 100644
--- a/src/app/posts/[slug]/page.tsx
+++ b/src/app/posts/[slug]/page.tsx
@@ -1,4 +1,4 @@
-import { notFound } from "next/navigation";
+import { notFound, permanentRedirect } from "next/navigation";
import type { Metadata } from "next";
import Link from "next/link";
import { fetchPost, fetchPosts, getSiteConfig } from "@/lib/api";
@@ -39,6 +39,7 @@ export async function generateMetadata({
return {
title,
description,
+ alternates: { canonical: `/posts/${post.slug}` },
openGraph: {
title,
description,
@@ -68,6 +69,10 @@ export default async function PostDetailPage({
notFound();
}
+ if (post.slug !== slug) {
+ permanentRedirect(`/posts/${post.slug}`);
+ }
+
const date = new Date(post.publishedAt || post.createdAt).toLocaleDateString(
"en-CA",
{ year: "numeric", month: "long", day: "numeric" },
diff --git a/src/app/toronto/memos/[slug]/page.tsx b/src/app/toronto/memos/[slug]/page.tsx
index 615c90f..7b170ec 100644
--- a/src/app/toronto/memos/[slug]/page.tsx
+++ b/src/app/toronto/memos/[slug]/page.tsx
@@ -1,4 +1,4 @@
-import { notFound } from "next/navigation";
+import { notFound, permanentRedirect } from "next/navigation";
import type { Metadata } from "next";
import Image from "next/image";
import { fetchMemo, fetchMemos, getSiteConfig } from "@/lib/api";
@@ -48,7 +48,7 @@ export async function generateMetadata({
return {
title,
description,
- alternates: { canonical: `${BASE_PATH}/${slug}` },
+ alternates: { canonical: `${BASE_PATH}/${memo.slug}` },
openGraph: {
title,
description,
@@ -79,6 +79,10 @@ export default async function TorontoMemoDetailPage({
notFound();
}
+ if (memo.slug !== slug) {
+ permanentRedirect(`${BASE_PATH}/${memo.slug}`);
+ }
+
const authorImage = memo.author.photo;
const keyMessages = memo.keyMessages;