<!-- Generated from ru/llms-txt-express/index.html. The canonical document is the HTML page. -->

- [ Главная ](/ru/) 
/
- [ Как создать ](/ru/how-to-create/) 
/
- Руководство по Express.js            
# `llms.txt` для Express.js

Express — самый популярный веб-фреймворк Node.js. Отдавать llms.txt просто: через express.static() для static-файла или отдельный маршрут GET для динамической генерации.

Последнее обновление: 22 апреля 2026 г.

На этой странице

- [ Вариант 1: статический файл с express.static() ](#static)
- [ Вариант 2: отдельный маршрут GET ](#route)
- [ Версия TypeScript ](#typescript)
- [ Динамическая генерация из метаданных маршрутов ](#dynamic)
- [ Заголовок Cache-Control ](#cache)
- [ Проверить ](#verify)
- [ Контрольный список перед выпуском ](#checklist)              
Примечание

Какой подход выбрать?

Используйте  статический файл  подход, если ваш  llms.txt  меняется редко,
а вы уже раздаёте статические ресурсы с  express.static() . Используйте  Маршрут GET  если вы хотите динамически генерировать содержимое из базы данных, CMS или метаданных маршрута.

## Вариант 1: статический файл с express.static()

Если ваше приложение уже использует `express.static()` для обслуживания `public/` 
папку, просто поместите `llms.txt` в эту папку. Express обслужит его по адресу `/llms.txt` без дополнительного кода.
server.js, static file approach    Копировать     

```
// server.js
const express = require('express');
const app = express();

// Serve everything in ./public/ at the root URL.
// If public/llms.txt exists, it is available at /llms.txt automatically.
app.use(express.static('public'));

app.listen(3000, () => console.log('Listening on http://localhost:3000'));

// Project structure:
// your-express-app/
// ├── public/
// │   └── llms.txt   ← add this
// └── server.js

```

Express автоматически задаёт `Content-Type` в `text/plain` 
для `.txt` файлы, доступные через `express.static()`. Чтобы добавить `Cache-Control` в заголовке, передайте `maxAge` в статических вариантах:
Cache-Control with express.static()    Копировать     

```
app.use(express.static('public', { maxAge: '1h' }));
```

## Вариант 2: отдельный маршрут GET

Для полного контроля над заголовками и содержимым добавьте отдельный маршрут. Это также
правильный подход, если содержимое создаётся во время выполнения из базы данных или реестра
маршрутов вашего API.
server.js, GET route    Копировать     

```
// server.js, dedicated GET route
const express = require('express');
const app = express();

const llmsContent = `# Your Site

> One-sentence description of what your site or product does.

## Documentation

- [Getting Started](https://yoursite.com/docs/start): Install and configure in minutes.
- [API Reference](https://yoursite.com/docs/api): Full endpoint catalog with examples.

## Product

- [Overview](https://yoursite.com/product): Core features and capabilities.
- [Pricing](https://yoursite.com/pricing): Plans and billing details.

## Optional

- [Changelog](https://yoursite.com/changelog): Release history.
- [GitHub](https://github.com/your-org/your-repo): Source code.
`;

app.get('/llms.txt', (req, res) => {
res.type('text/plain');
res.set('Cache-Control', 'public, max-age=3600, stale-while-revalidate=86400');
res.send(llmsContent);
});

app.listen(3000);

```

Разместите этот маршрут **до** любые обработчики универсальных маршрутов или middleware
для 404, иначе Express никогда не дойдёт до него.

## Версия TypeScript

Если в вашем проекте используется TypeScript с `@types/express`, явно укажите
параметры обработчика, чтобы избежать неявного `any` ошибки:
server.ts, TypeScript    Копировать     

```
// server.ts, TypeScript version with typed Request/Response
import express, { Request, Response } from 'express';

const app = express();

const llmsContent = `# Your Site

> One-sentence description of your product or service.

## Documentation

- [Getting Started](https://yoursite.com/docs/start): Quick setup guide.
- [API Reference](https://yoursite.com/docs/api): Full endpoint catalog.

## Optional

- [Changelog](https://yoursite.com/changelog): Release history.
`;

app.get('/llms.txt', (req: Request, res: Response): void => {
res.set({
'Content-Type': 'text/plain; charset=utf-8',
'Cache-Control': 'public, max-age=3600, stale-while-revalidate=86400',
});
res.send(llmsContent);
});

app.listen(3000, () => console.log('Server running on http://localhost:3000'));

```

## Динамическая генерация из метаданных маршрутов

Для более крупных приложений поддерживайте `publicRoutes` массив рядом с определениями
маршрутов. Файл `/llms.txt` обработчик преобразует этот массив в ссылки Markdown, поддерживая
синхронизацию файла с фактическими маршрутами.
server.js, dynamic generation    Копировать     

```
// server.js, generate llms.txt dynamically from route metadata
const express = require('express');
const app = express();

// Define your public routes with metadata
const publicRoutes = [
{ title: 'Getting Started', path: '/docs/start', description: 'Install and configure in minutes.' },
{ title: 'API Reference', path: '/docs/api', description: 'Full endpoint catalog with examples.' },
{ title: 'Authentication', path: '/docs/auth', description: 'OAuth 2.0 and API key setup.' },
{ title: 'Webhooks', path: '/docs/webhooks', description: 'Event payloads and retry policy.' },
{ title: 'Pricing', path: '/pricing', description: 'Plans and billing details.' },
];

const SITE_URL = process.env.SITE_URL || 'https://yoursite.com';

app.get('/llms.txt', (req, res) => {
const links = publicRoutes
.map((r) => `- [${r.title}](${SITE_URL}${r.path}): ${r.description}`)
.join('\n');

const body = [
'# Your Site',
'',
'> One-sentence description of your product.',
'',
'## Documentation',
'',
links,
].join('\n');

res.set({
'Content-Type': 'text/plain; charset=utf-8',
'Cache-Control': 'public, max-age=3600, stale-while-revalidate=86400',
});
res.send(body);
});

app.listen(3000);

```

Установите `SITE_URL` как переменную окружения, чтобы один и тот же код работал в локальной,
тестовой и производственной средах.

## заголовок Cache-Control

Всегда добавляйте `Cache-Control` заголовок. TTL в один час с `stale-while-revalidate` — разумное значение по умолчанию: оно позволяет обратным прокси
и CDN (nginx, Cloudflare, AWS CloudFront) кэшировать ответ и отдавать устаревшее содержимое во время
фоновой повторной проверки:
Recommended Cache-Control    Копировать     

```
res.set('Cache-Control', 'public, max-age=3600, stale-while-revalidate=86400');
```

Если перед Express используется CDN, проверьте, что CDN учитывает `Cache-Control` от источника. Cloudflare учитывает его по умолчанию; AWS CloudFront требует
политики кэширования, разрешающей передавать заголовки источника дальше.

## Проверить

После запуска сервера убедитесь, что файл отдается корректно:
Local verification    Копировать     

```
# Check headers
curl -I http://localhost:3000/llms.txt
# Expected:
# HTTP/1.1 200 OK
# Content-Type: text/plain; charset=utf-8
# Cache-Control: public, max-age=3600

# Check content
curl http://localhost:3000/llms.txt | head -5
# Should print:  # Your Site
```

После развертывания выполните ту же проверку для рабочего URL, затем вставьте результат в [Валидатор llms.txt](/ru/validator/) для полного соответствия спецификации.

## Контрольный список перед выпуском

- Файл отдан по адресу `/llms.txt` с помощью `200 OK`. 
- `Content-Type: text/plain; charset=utf-8` установлен. 
- `Cache-Control` заголовок присутствует. 
- Ровно один заголовок H1 в начале файла. 
- Сводка в blockquote сразу после H1. 
- Все URL абсолютны (`https://`). 
- Маршрут зарегистрирован до любых универсальных маршрутов или обработчиков 404. 
- Валидатор не возвращает ошибок: [llmtxt.info/validator/](/ru/validator/)   
## Связанные руководства

- [Как создать llms.txt](/ru/how-to-create/), шаблоны и контрольный список. 
- [Справочник формата llms.txt](/ru/llms-txt-format/), подробности спецификации. 
- [Лучшие практики](/ru/best-practices/), что включать, а что пропускать. 
- [Валидатор](/ru/validator/) · [Генератор](/ru/generator/).        
## Источники

- [ llmstxt.org, предложение сообщества ](https://llmstxt.org/)
- [ Документация Express.js, express.static() ](https://expressjs.com/en/starter/static-files/)
- [ Документация Express.js, маршрутизация ](https://expressjs.com/en/guide/routing/)
