feat: чистые URL без .html
- VitePress: включён cleanUrls - Caddyfile: try_files пробует .html для запросов без расширения - Caddyfile: 301-редирект /foo.html → /foo для совместимости - sitemap.xml: канонические URL без .html
This commit is contained in:
@@ -127,6 +127,10 @@ export default defineConfig({
|
|||||||
title: 'NextJS Style Guide',
|
title: 'NextJS Style Guide',
|
||||||
description: 'Стандарты разработки на Next.js + TypeScript с архитектурой SLM',
|
description: 'Стандарты разработки на Next.js + TypeScript с архитектурой SLM',
|
||||||
|
|
||||||
|
// Чистые URL без `.html` — канон для индексации.
|
||||||
|
// Серверная поддержка реализована в Caddyfile (try_files + редирект).
|
||||||
|
cleanUrls: true,
|
||||||
|
|
||||||
// Дублируем указатель на llms.txt в <head> — для агентов,
|
// Дублируем указатель на llms.txt в <head> — для агентов,
|
||||||
// которые читают HTML, но не парсят полный DOM/href.
|
// которые читают HTML, но не парсят полный DOM/href.
|
||||||
head: [
|
head: [
|
||||||
|
|||||||
12
Caddyfile
12
Caddyfile
@@ -7,6 +7,15 @@
|
|||||||
redir /docs/llms.txt /llms.txt 301
|
redir /docs/llms.txt /llms.txt 301
|
||||||
redir /docs/llms-full.txt /llms-full.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).
|
# Подсказка агентам, где лежит карта документации (RFC 8288).
|
||||||
# Позволяет найти llms.txt без парсинга DOM — по HTTP-заголовку.
|
# Позволяет найти llms.txt без парсинга DOM — по HTTP-заголовку.
|
||||||
header Link "</llms.txt>; rel=\"llms\""
|
header Link "</llms.txt>; rel=\"llms\""
|
||||||
@@ -30,5 +39,6 @@
|
|||||||
respond @missingText 404
|
respond @missingText 404
|
||||||
|
|
||||||
file_server
|
file_server
|
||||||
try_files {path} {path}/ /index.html
|
# cleanUrls: пробуем точное совпадение → +.html → каталог → SPA-фолбэк.
|
||||||
|
try_files {path} {path}.html {path}/ /index.html
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -527,9 +527,8 @@ const buildSitemap = (): void => {
|
|||||||
|
|
||||||
for (const entry of entries) {
|
for (const entry of entries) {
|
||||||
const link = entry.link;
|
const link = entry.link;
|
||||||
// VitePress отдаёт страницы как HTML; для index — каталог со слешем.
|
// cleanUrls: канон без `.html`. Index-страницы — каталог со слешем.
|
||||||
const url = link.endsWith('/') ? `${SITE_URL}${link}` : `${SITE_URL}${link}.html`;
|
urls.add(`${SITE_URL}${link}`);
|
||||||
urls.add(url);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const today = BUILD_DATE.slice(0, 10);
|
const today = BUILD_DATE.slice(0, 10);
|
||||||
|
|||||||
Reference in New Issue
Block a user