Маленький робот держит файл LLMS.TXT около серверной стойки с надписью HTTP CORS

Как настроить CORS-заголовки для ИИ-краулеров: решаем проблему с llms.txt на Apache и Nginx

С развитием ИИ-поиска (AEO) веб-мастерам стало мало стандартного robots.txt. Поисковые ИИ-агенты (такие как SearchGPT, ChatGPT, Gemini или Яндекс Нейро) требуют структурированный контекст о сайте. Для этого в корень проектов внедряются новые файлы спецификаций — llms.txt и llms-author.txt.

Однако просто создать эти файлы и загрузить их на сервер часто недостаточно. Как только сторонние ИИ-сервисы, аналитические платформы или внешние веб-интерфейсы пытаются прочитать их напрямую через JavaScript-скрипты (Fetch или Axios), они натыкаются на стандартную политику безопасности браузеров — ошибку CORS (Cross-Origin Resource Sharing).

Если сервер запрещает кросс-доменные запросы, внешние системы не могут прочитать файлы спецификаций, и ваш сайт теряет видимость в умных ответах ИИ. Чтобы решить эту проблему, необходимо точечно настроить CORS-заголовки на стороне веб-сервера. Задача — открыть полный доступ к файлам llms.txt и llms-author.txt для любых внешних запросов, но при этом сохранить под замком остальную критическую инфраструктуру сайта.

Настройка CORS на сервере Apache (.htaccess)

Для того чтобы файлы llms.txt и llms-author.txt отдавались сервером без ограничений, нам нужно принудительно добавить заголовок Access-Control-Allow-Origin: *. Но делать это глобально для всего сайта небезопасно. Наша цель — изолировать правила и применить их строго к двум конкретным файлам.

Для этого используется модуль Apache mod_headers и директива FilesMatch. Откройте файл .htaccess в корне вашего сайта и добавьте в него следующий конфигурационный блок:

apache

<IfModule mod_headers.c>
    # Открываем CORS-доступ строго для ИИ-спецификаций
    <FilesMatch "^(llms\.txt|llms-author\.txt)$">
        Header set Access-Control-Allow-Origin "*"
        Header set Access-Control-Allow-Methods "GET, OPTIONS"
        Header set Access-Control-Allow-Headers "Content-Type, User-Agent"
    </FilesMatch>
</IfModule>

Как работает эта конфигурация:

  1. <IfModule mod_headers.c> — сервер проверяет, включен ли модуль обработки заголовков, чтобы избежать критической ошибки 500.
  2. <FilesMatch ...> — регулярное выражение четко ограничивает зону действия правил. Сервер среагирует только тогда, когда запрос придет точно на llms.txt или llms-author.txt. Никакие другие файлы или скрипты в корне сайта под это правило не попадут.
  3. Header set Access-Control-Allow-Origin "*" — главный заголовок, который разрешает любым сторонним ИИ-сервисам и скриптам читать содержимое этих файлов без блокировки со стороны браузера.
  4. Ограничение методов — мы разрешаем только безопасные запросы GET (чтение данных) и OPTIONS (предварительный запрос проверки связи), полностью закрывая возможность отправки скрытых форм или изменения данных (POST, PUT, DELETE).

После сохранения файла .htaccess изменения вступают в силу мгновенно. Перезагружать сервер Apache не требуется.

Настройка CORS на сервере Nginx

На серверах Nginx конфигурация задается внутри блока server в файле конфигурации вашего виртуального хоста (например, /etc/nginx/sites-available/ваш-сайт.conf).

ИИ-краулеры и внешние JS-скрипты перед отправкой основного запроса часто посылают предварительный запрос типа OPTIONS (так называемый preflight-запрос), чтобы проверить, разрешен ли доступ к ресурсу. Если сервер не ответит на него корректно, сам файл прочитан не будет.

Добавьте следующий блок location в конфигурацию вашего сайта:

nginx

# Изолированный блок для файлов ИИ-спецификаций
location ~* ^/(llms\.txt|llms-author\.txt)$ {
    # Разрешаем доступ для всех доменов
    add_header 'Access-Control-Allow-Origin' '*' always;
    add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS' always;
    add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' always;
    
    # Обработка предварительного запроса OPTIONS
    if ($request_method = 'OPTIONS') {
        add_header 'Access-Control-Allow-Origin' '*' always;
        add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS' always;
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' always;
        # Кешируем результат preflight-запроса на 20 дней
        add_header 'Access-Control-Max-Age' 1728000;
        add_header 'Content-Type' 'text/plain; charset=utf-8';
        add_header 'Content-Length' 0;
        return 204;
    }
    
    # Проверяем физическое наличие файла, иначе отдаем 404
    try_files $uri =404;
}

Разбор важных нюансов для Nginx:

  1. Регулярное выражение ~* ^/(llms\.txt|llms-author\.txt)$ — перехватывает запросы строго к этим двум файлам, регистронезависимо. Запросы к остальным ресурсам идут по своим стандартным правилам.
  2. Параметр always — гарантирует, что Nginx отдаст CORS-заголовки не только при успешном ответе (200), но и в случае ошибок (например, если файл временно перенесен или недоступен).
  3. Конструкция return 204 — если пришел метод OPTIONS, сервер моментально возвращает статус 204 (No Content) вместе с разрешающими CORS-заголовками, даже не пытаясь читать файл с диска. Это экономит ресурсы процессора.

После внесения изменений обязательно проверьте конфигурацию на ошибки командой sudo nginx -t. Если всё в порядке, примените настройки: sudo systemctl reload nginx.

Как проверить, работают ли CORS-заголовки?

Самый надежный способ убедиться, что ИИ-боты смогут прочитать ваши файлы — проверить ответы сервера через обычную консоль или специализированные инструменты (например, внутренний анализатор кодов ответа сервера).

Выполните в терминале команду curl с запросом метода OPTIONS:

curl -I -X OPTIONS https://webindex.su

В ответе сервера вы должны четко увидеть строку:
Access-Control-Allow-Origin: *

Если эта строка присутствует, значит, защита сервера настроена ювелирно: ИИ-краулеры получат беспрепятственный доступ к контексту сайта, а остальная часть вашего проекта останется в полной безопасности.

Прокрутить вверх