Wyszukiwarki czytają kody HTTP jak instrukcje. Złe kody wyciekają moc linków albo trzymają martwe strony w indeksie.
Trwałe przenosiny — w next.config.mjs (zwraca 308, traktowany przez Google jak 301):
// next.config.mjs
export default {
async redirects() {
return [
{
source: "/old-blog/:slug",
destination: "/blog/:slug",
permanent: true,
},
];
},
};
Przekierowania w aplikacji — wybierz funkcję zgodną z semantyką:
import { redirect, permanentRedirect, notFound } from "next/navigation";
// 307 — tymczasowe (bramki logowania, routing A/B)
redirect("/login");
// 308 — trwałe (slug się zmienił, stary URL ma przekazać moc)
permanentRedirect(`/blog/${post.newSlug}`);
// Prawdziwy 404 z twoim UI z not-found.tsx
if (!post) notFound();
Zasady czystego indeksu:
- Zero łańcuchów przekierowań: stary → starszy → aktualny marnuje crawl budget i rozmywa sygnały. Zawsze przekierowuj prosto na końcowy URL.
- Brakująca treść zwraca 404, a nie stronę „nic nie znaleziono" z kodem 200 (soft 404 — Google flaguje je w Search Console).
- Wybierz jedną formę URL i egzekwuj ją: z ukośnikiem końcowym lub bez (
trailingSlashw configu), małe litery, bez duplikatów www/bez-www (przekierowanie na poziomie edge/DNS). - Zmieniasz slug — dodaj przekierowanie w tym samym PR. Wsteczna archeologia przekierowań nie zdarza się nigdy.
Zmieniasz platformę? Pełny playbook — inwentarz, mapa przekierowań, kontrola parytetu i monitoring startu — w temacie Migracja SEO.
Checklista:
- Wszystkie stare adresy przekierowują 308/301 prosto do miejsc docelowych (bez łańcuchów)
- Własny
not-found.tsx, który faktycznie zwraca 404 - Jedna kanoniczna forma URL (ukośnik, wielkość liter, host) w całej witrynie
- Zmiana sluga zawsze jedzie razem ze swoim przekierowaniem