Большинство разработчиков относятся к SEO как к проблеме маркетинга. Это не так. Техническое SEO — это проблема кода, и большая часть ущерба происходит, когда разработчики шипят без него.
Я проаудировал 15+ Next.js-проектов. В каждом без исключения было минимум 5 из этих 12 проблем. Каждый фикс занимает менее 30 минут. Вместе они — разница между «Google не может проиндексировать половину ваших страниц» и «ваш сайт работает как ожидается».
Чеклист
1. Canonical URL на каждой странице
Без канонического тега Google видит https://site.com/page, https://site.com/page/ и https://site.com/page?ref=twitter как три отдельные страницы с дублирующимся контентом.
// app/[locale]/layout.tsx
export async function generateMetadata({ params }: Props) {
const { locale } = await params
return {
alternates: {
canonical: `https://dimaver6.com/${locale}`,
},
}
}
Каждая страница. Без исключений.
2. hreflang для мультиязычных сайтов
Если у вас несколько языков, Google должен знать, какая страница является эквивалентом на каждом языке. Без hreflang Google может показать русскую страницу англоязычным пользователям.
alternates: {
languages: {
en: `/en/${slug}`,
ru: `/ru/${slug}`,
uk: `/uk/${slug}`,
},
}
Я написал полный гайд по i18n-роутингу и SEO-паттернам включая hreflang и x-default.
3. Сайтмап с точным lastmod
Сайтмап говорит Google «вот все мои страницы». Но сайтмап с неправильными lastmod датами хуже, чем отсутствие сайтмапа — он приучает Google игнорировать ваши сигналы свежести.
// app/sitemap.ts — НЕПРАВИЛЬНО
lastModified: new Date(), // каждый билд = «всё изменилось»
// app/sitemap.ts — ПРАВИЛЬНО
lastModified: post.date, // реальная дата изменения контента
Ставьте lastmod на реальную дату, когда контент был осмысленно изменён. Не дату билда. Не new Date().
4. robots.txt, который не блокирует сам себя
Я видел Next.js-проекты, где robots.txt случайно блокировал сайтмап, API-роуты или директорию _next/static.
// app/robots.ts
export default function robots() {
return {
rules: { userAgent: '*', allow: '/' },
sitemap: 'https://dimaver6.com/sitemap.xml',
}
}
После деплоя проверьте: curl https://yoursite.com/robots.txt. Убедитесь, что разрешён / и указан правильный URL сайтмапа.
5. Meta-тайтлы до 60 символов
Google обрезает тайтлы длиннее ~60 символов. Тайтл, который читается как «How Much Does a Custom SaaS MVP Cost in 2026? A Real Breakdow...» теряет свою силу.
// ✅ 54 символа
title: 'Custom SaaS MVP cost in 2026 — real breakdown'
// ❌ 78 символов — обрезается
title: 'How much does a custom SaaS MVP cost in 2026? A real breakdown from 30 projects'
Ставьте ключевое слово ближе к началу. Бренд в конце (если вообще).
6. Meta-описания, совпадающие с поисковым интентом
Google использует meta description как сниппет в поисковой выдаче. Если ваше дженерик — Google перепишет его (плохо). Если конкретное — Google покажет ваше, и вы контролируете клик.
description: 'Построчная разбивка стоимости реального Next.js MVP за €12K: авторизация, платежи, админка, тестирование, деплой. С тем, что бы я вырезал, чтобы уложиться в €8K.'
Включите основное ключевое слово, конкретную деталь (€12K) и причину кликнуть («что бы я вырезал»). До 155 символов.
7. Структурированные данные (JSON-LD)
Структурированные данные дают Google явную информацию о типе вашего контента. Для блог-постов — схема Article. Для услуг — Service. Для бизнеса — LocalBusiness или ProfessionalService.
<script
type="application/ld+json"
dangerouslySetInnerHTML={{
__html: JSON.stringify({
'@context': 'https://schema.org',
'@type': 'Article',
headline: post.title,
datePublished: post.date,
author: {
'@type': 'Person',
name: 'Dmitry Vereschagin',
},
}),
}}
/>
Структурированные данные не влияют на ранжирование напрямую, но включают расширенные сниппеты (рейтинги, даты, FAQ), которые драматически улучшают CTR.
8. Alt-текст и размеры изображений
Каждому <Image> нужны три вещи:
alt-текст, описывающий изображение (не «image1.png»)- Атрибуты
widthиheight(предотвращают сдвиг макета) - Современный формат (WebP или AVIF через оптимизацию Next.js Image)
Отсутствие alt-текста означает, что Google Image Search не может индексировать ваши изображения. Отсутствие размеров означает CLS, что является фактором ранжирования.
9. Внутренняя перелинковка между связанным контентом
Google находит страницы, переходя по ссылкам. Если на страницу нет ни одной внутренней ссылки, Google может её никогда не найти — даже если она в сайтмапе.
Каждый блог-пост должен ссылаться минимум на 2 связанных поста. Каждая страница услуг — на релевантные кейсы. Каждый кейс — обратно на страницу услуг.
10. Скорость страницы (Core Web Vitals)
Google использует Core Web Vitals как фактор ранжирования. Три метрики:
- LCP (Largest Contentful Paint): до 2.5с
- FID/INP (Interaction to Next Paint): до 200мс
- CLS (Cumulative Layout Shift): до 0.1
Я писал о достижении Lighthouse 98 — большая часть работы в устранении ресурсов, блокирующих рендер, и правильном размере изображений.
11. 404-страницы, возвращающие 404-статус
Частая ошибка в Next.js: кастомные 404-страницы, возвращающие статус 200. Google индексирует их как реальные страницы, создавая «мягкие 404» в Search Console.
Проверьте HTTP-статус: curl -I https://yoursite.com/nonexistent-page. Должен вернуть 404, не 200.
12. HTTPS-редирект и www-канонизация
Если и http://, и https:// резолвятся, или и www., и без www. резолвятся, Google видит дублирующийся контент. Настройте один канонический домен и 301-редирект всех вариаций на него.
Большинство хостингов (Vercel, Cloudflare) обрабатывают это автоматически. Проверьте: curl -I http://yoursite.com должен вернуть 301 → https://yoursite.com.
30-минутный аудит
Запустите эти 4 команды, чтобы найти большинство проблем:
curl -s https://yoursite.com/robots.txt— проверьте корректностьcurl -s https://yoursite.com/sitemap.xml | head -50— проверьте, что страницы перечислены с правильными датами- Chrome DevTools → Lighthouse → SEO-аудит
- Google Search Console → Проверка URL → протестируйте важнейшие страницы
Большинство проблем — это конфигурация, не код. Исправьте их один раз, убедитесь, что они переживают деплои, и двигайтесь дальше.
Хотите технический SEO-аудит вашего Next.js-сайта? Напишите — я прогоняю этот чеклист на каждом клиентском проекте и обычно нахожу 5+ быстрых побед.