From 74cbd43a239bfaeedb4b16edc597a75cd142f378 Mon Sep 17 00:00:00 2001 From: "S.Gromov" Date: Mon, 27 Apr 2026 10:12:30 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D1=87=D0=B8=D1=81=D1=82=D1=8B=D0=B5=20?= =?UTF-8?q?URL=20=D0=B1=D0=B5=D0=B7=20.html?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - VitePress: включён cleanUrls - Caddyfile: try_files пробует .html для запросов без расширения - Caddyfile: 301-редирект /foo.html → /foo для совместимости - sitemap.xml: канонические URL без .html --- .vitepress/config.ts | 4 ++++ Caddyfile | 12 +++++++++++- generate-llms.ts | 5 ++--- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/.vitepress/config.ts b/.vitepress/config.ts index 522078c..1ad0fce 100644 --- a/.vitepress/config.ts +++ b/.vitepress/config.ts @@ -127,6 +127,10 @@ export default defineConfig({ title: 'NextJS Style Guide', description: 'Стандарты разработки на Next.js + TypeScript с архитектурой SLM', + // Чистые URL без `.html` — канон для индексации. + // Серверная поддержка реализована в Caddyfile (try_files + редирект). + cleanUrls: true, + // Дублируем указатель на llms.txt в — для агентов, // которые читают HTML, но не парсят полный DOM/href. head: [ diff --git a/Caddyfile b/Caddyfile index e9412f9..77aaa82 100644 --- a/Caddyfile +++ b/Caddyfile @@ -7,6 +7,15 @@ redir /docs/llms.txt /llms.txt 301 redir /docs/llms-full.txt /llms-full.txt 301 + # Чистые URL: запросы вида `/docs/foo.html` редиректим на `/docs/foo`. + # Канон сайта — без `.html` (cleanUrls в VitePress). + # Не трогаем index.html в корне — он не имеет смысловой пары без расширения. + @legacyHtml { + path_regexp legacyHtml ^(/.+)\.html$ + not path /index.html + } + redir @legacyHtml {re.legacyHtml.1} 301 + # Подсказка агентам, где лежит карта документации (RFC 8288). # Позволяет найти llms.txt без парсинга DOM — по HTTP-заголовку. header Link "; rel=\"llms\"" @@ -30,5 +39,6 @@ respond @missingText 404 file_server - try_files {path} {path}/ /index.html + # cleanUrls: пробуем точное совпадение → +.html → каталог → SPA-фолбэк. + try_files {path} {path}.html {path}/ /index.html } diff --git a/generate-llms.ts b/generate-llms.ts index 9afcf9f..6d55767 100644 --- a/generate-llms.ts +++ b/generate-llms.ts @@ -527,9 +527,8 @@ const buildSitemap = (): void => { for (const entry of entries) { const link = entry.link; - // VitePress отдаёт страницы как HTML; для index — каталог со слешем. - const url = link.endsWith('/') ? `${SITE_URL}${link}` : `${SITE_URL}${link}.html`; - urls.add(url); + // cleanUrls: канон без `.html`. Index-страницы — каталог со слешем. + urls.add(`${SITE_URL}${link}`); } const today = BUILD_DATE.slice(0, 10);