Поисковики читают HTTP-коды как инструкции. Неправильные коды сливают ссылочный вес или держат мёртвые страницы в индексе.
Постоянные переезды — в next.config.mjs (возвращает 308, для Google эквивалент 301):
// next.config.mjs
export default {
async redirects() {
return [
{
source: "/old-blog/:slug",
destination: "/blog/:slug",
permanent: true,
},
];
},
};
Редиректы внутри приложения — выбирайте функцию по смыслу:
import { redirect, permanentRedirect, notFound } from "next/navigation";
// 307 — временный (логин-гейты, A/B-роутинг)
redirect("/login");
// 308 — постоянный (слаг изменился, старый URL должен передать вес)
permanentRedirect(`/blog/${post.newSlug}`);
// Настоящий 404 с вашим UI из not-found.tsx
if (!post) notFound();
Правила чистого индекса:
- Никаких цепочек редиректов: старый → постарше → актуальный тратит краул-бюджет и размывает сигналы. Всегда редиректьте сразу на конечный URL.
- Отсутствующий контент возвращает 404, а не страницу «ничего не найдено» с кодом 200 (soft 404 — Google помечает такие в Search Console).
- Выберите одну форму URL и соблюдайте её: со слэшем или без (
trailingSlashв конфиге), нижний регистр, без дублей www/без-www (редирект на уровне edge/DNS). - Меняете слаг — добавляйте редирект в том же PR. Ретроспективная археология редиректов не случается никогда.
Переезжаете на новую платформу? Полный плейбук — инвентарь, карта редиректов, проверка паритета и мониторинг запуска — в теме SEO-миграция.
Чеклист:
- Все старые URL редиректятся 308/301 сразу на конечные (без цепочек)
- Кастомный
not-found.tsx, который действительно возвращает 404 - Одна каноническая форма URL (слэш, регистр, хост) по всему сайту
- Смена слага всегда едет в проде вместе со своим редиректом