From 55f88d5227151326b9e70e07e8c4110a0be28aaf Mon Sep 17 00:00:00 2001 From: striker Date: Mon, 16 Mar 2026 00:56:47 +0300 Subject: [PATCH] SEO: JSON-LD, hreflang x-default, 404 page, localized OG MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - FaqSection: h1/h2 based on standalone prop (fixes missing H1 on /faq) - faq/page: FAQPage JSON-LD, hreflang x-default, OG image/url - kontakty/page: LocalBusiness JSON-LD (address, geo, tel, openingHours), hreflang x-default, OG - uslugi/page: geo in H1 («в Пушкино»), hreflang x-default, OG, expanded description - [lang]/page: Organization JSON-LD, localized OG (ru_RU/en_US), x-default hreflang - [slug]/page: localized og:title/siteName, x-default hreflang, areaServed+telephone in Service JSON-LD - not-found.tsx: 404 page → generates 404.html for nginx error_page directive Co-Authored-By: Claude Sonnet 4.6 --- src/app/[lang]/faq/page.tsx | 37 ++++++++++++++- src/app/[lang]/kontakty/page.tsx | 62 ++++++++++++++++++++++++-- src/app/[lang]/page.tsx | 42 ++++++++++++++--- src/app/[lang]/uslugi/[slug]/page.tsx | 12 ++++- src/app/[lang]/uslugi/page.tsx | 28 ++++++++++-- src/app/not-found.tsx | 32 +++++++++++++ src/components/sections/FaqSection.tsx | 5 ++- 7 files changed, 200 insertions(+), 18 deletions(-) create mode 100644 src/app/not-found.tsx diff --git a/src/app/[lang]/faq/page.tsx b/src/app/[lang]/faq/page.tsx index 9d9bb6a..1d23c69 100644 --- a/src/app/[lang]/faq/page.tsx +++ b/src/app/[lang]/faq/page.tsx @@ -9,10 +9,28 @@ export function generateStaticParams() { export async function generateMetadata({ params }: { params: Promise<{ lang: string }> }): Promise { const { lang } = await params const d = getDictionary(lang) + const isRu = lang === 'ru' return { title: d.faq.title, - description: d.faq.subtitle, - alternates: { canonical: `https://sag24.ru/${lang}/faq/` }, + description: isRu + ? 'Ответы на частые вопросы об IT-аутсорсинге в Пушкино: стоимость, сроки реакции, состав услуг, зона обслуживания.' + : 'Answers to common questions about IT outsourcing in Pushkino: pricing, response time, service scope, coverage area.', + alternates: { + canonical: `https://sag24.ru/${lang}/faq/`, + languages: { + 'ru': 'https://sag24.ru/ru/faq/', + 'en': 'https://sag24.ru/en/faq/', + 'x-default': 'https://sag24.ru/ru/faq/', + }, + }, + openGraph: { + title: isRu ? 'Частые вопросы об IT-аутсорсинге | Сисадмингрупп' : 'IT Outsourcing FAQ | SysadminGroup', + description: isRu + ? 'Ответы на частые вопросы об IT-аутсорсинге в Пушкино: стоимость, сроки, состав услуг.' + : 'Common IT outsourcing questions: pricing, SLA, service scope.', + url: `https://sag24.ru/${lang}/faq/`, + images: [{ url: '/og-image.png', width: 1200, height: 630 }], + }, } } @@ -20,9 +38,24 @@ export default async function FaqPage({ params }: { params: Promise<{ lang: stri const { lang: langStr } = await params const lang = langStr as Locale const d = getDictionary(lang) + + const faqSchema = { + '@context': 'https://schema.org', + '@type': 'FAQPage', + 'mainEntity': d.faq.items.map(item => ({ + '@type': 'Question', + 'name': item.q, + 'acceptedAnswer': { '@type': 'Answer', 'text': item.a }, + })), + } + return (
+