Laravel і AI-пошук: чому один проєкт цитують, а другий невидимий

Laravel і AI-пошук: чому один проєкт цитують, а другий невидимий

Коротка відповідь: усе вирішує режим рендерингу, а не сам фреймворк. Blade і Livewire віддають готовий HTML з сервера, і пошуковий агент бачить текст одразу. Inertia у звʼязці з Vue чи React без увімкненого SSR повертає майже порожню сторінку, і для ШІ такого контенту фактично не існує. Перевіряється це одним запитом у термінал, а не здогадками. Нижче що саме повертає кожен режим і як це полагодити.

Я пишу бекенд і останній рік регулярно розбираю одну й ту саму ситуацію. Проєкт зроблений добре, сторінки швидкі, у браузері все видно, а в ШІ-відповідях компанії немає взагалі. Перше, що я роблю в таких випадках, це дивлюсь не на контент, а на те, що сервер віддає боту.

Перевірка, з якої варто почати

Відкрийте термінал і витягніть свою сторінку так, як це робить пошуковий агент, тобто без браузера й без виконання JavaScript:

curl -A "OAI-SearchBot" https://ваш-сайт/сторінка

Далі шукайте в відповіді текст, який має бути на сторінці. Якщо ви бачите заголовки, абзаци й описи, все гаразд. Якщо ж повертається каркас із порожнім контейнером і посиланнями на скрипти, то для ретриву ваша сторінка порожня. Ніякі описи, розмітка чи ключові слова тут не допоможуть, бо машині просто нема що різати на фрагменти.

Це базова перевірка, і вона займає хвилину. Дивно, як рідко її роблять перед тим, як замовляти роботу над видимістю.

Що повертає кожен режим Laravel

Тут і криється відповідь, чому два проєкти на одному фреймворку поводяться по-різному.

Blade. Класичні шаблони Laravel рендеряться на сервері. У відповідь іде повний HTML з усім текстом. Це найнадійніший варіант для контентних сторінок, і в цьому режимі фреймворк не створює вам жодних проблем із видимістю.

Livewire. Компоненти теж рендеряться на сервері, а JavaScript додає інтерактивність поверх готової розмітки. Первинна відповідь містить текст, тому агент бачить контент.

Inertia з Vue або React. Ось де починається біда. За замовчуванням це фактично односторінковий застосунок: сервер віддає оболонку, а вміст малює JavaScript уже в браузері. Людина бачить сторінку, бот отримує порожнечу. Лікується це вмиканням серверного рендерингу, який Inertia підтримує, але його треба свідомо налаштувати й тримати робочим, це окремий процес на сервері.

API плюс окремий фронтенд. Якщо Laravel у вас це тільки бекенд, а фронт зроблений окремо, то питання видимості вирішується не в Laravel взагалі, а на боці фронтенду й того, чи є там серверний рендеринг.

Правило коротке: те, що ви хочете бачити процитованим, має бути в HTML, який повертає сервер до виконання скриптів.

Що сервер повертає боту в різних режимах: Blade і Livewire видно, Inertia з Vue без SSR не видно

Технічні дрібниці, які тихо ламають видимість

Коли з рендерингом усе гаразд, лишаються речі, які підводять уже на рівні інфраструктури.

Коди відповідей. Сторінка, що віддає 200 із написом «нічого не знайдено», гірша за чесний 404. У Laravel це легко зробити ненавмисно, коли контролер повертає порожній результат замість того, щоб кинути виняток. Перевіряйте реальні статуси, а не те, що бачить користувач.

Час відповіді. Якщо серверний рендеринг важкий і сторінка збирається довго, агент може не дочекатись. Класична причина в Laravel це запити в циклі, коли на сторінку категорії летить сотня звернень до бази замість одного. Кешування й попереднє завантаження звʼязків тут дають більше, ніж будь-яка оптимізація тексту.

Кеш конфігурації на проді. Дрібниця, яка регулярно псує життя: локально все працює, а на сервері віддається старий варіант, бо кеш конфігурації або маршрутів не оновили після деплою.

robots.txt і доступ агентам. Перевірте, що ви не закрили пошукового бота разом із тренувальним. Це різні агенти з різними задачами, і блокування одним рядком усього, що містить назву моделі, регулярно вирізає саме той трафік, заради якого все робилось.

Що дає Laravel, коли база в порядку

Коли сервер віддає нормальний HTML, фреймворк починає працювати на вас.

Структуровані дані зручно збирати на бекенді, де у вас уже є всі сутності: товар, автор, організація, питання й відповіді. Вам не треба дублювати ці дані в шаблоні руками, ви віддаєте те саме джерело і в розмітку, і у видимий текст. Саме узгодженість між ними важить найбільше, бо розбіжність підриває довіру до сторінки.

Так само зручно тримати єдиний формат заголовків і описів: вони генеруються з тих самих полів, що й контент, тому не розʼїжджаються з часом. І сайтмап, який будується з бази, а не пишеться руками, показує реальний стан, а не те, що було рік тому.

Порядок дій, якщо вас не видно

Коротко й у правильній послідовності, бо порядок тут важливіший за старанність.

  1. Перевірте curl-ом, що сервер віддає текст боту. Поки цього немає, решта не має сенсу.
  2. Якщо повертається оболонка, вмикайте серверний рендеринг або переносьте контентні сторінки на Blade.
  3. Перевірте коди відповідей і швидкість генерації сторінки.
  4. Перевірте robots.txt і доступ на рівні CDN чи файрвола.
  5. І лише потім беріться за структуру тексту й розмітку.

Порядок дій, якщо вас не видно: спершу curl-перевірка, потім SSR, коди відповідей, robots.txt і лише потім текст

Часті питання

Laravel погано підходить для пошуку й ШІ? Сам фреймворк тут ні до чого. Blade і Livewire віддають готовий HTML і проблем не створюють. Питання виникає лише в режимі односторінкового застосунку без серверного рендерингу.

Чи достатньо додати структуровану розмітку? Ні. Розмітка пояснює машині, що на сторінці, але якщо видимого тексту в серверній відповіді немає, пояснювати нема чого.

Як швидко перевірити свій сайт? Витягніть сторінку через curl із ботівським user-agent і пошукайте в відповіді текст, який має бути видно. Порожньо означає, що для ретриву сторінки не існує.

Що робити, якщо проєкт уже на Inertia? Вмикати серверний рендеринг, він підтримується. Це окремий процес на сервері, який треба налаштувати й моніторити, але переписувати проєкт не потрібно.

Підсумок

Видимість проєкту на Laravel вирішує режим рендерингу, а не фреймворк. Blade і Livewire віддають серверний HTML, який агент читає одразу, а Inertia з Vue чи React без серверного рендерингу повертає порожню оболонку. Перевіряється це одним запитом curl із ботівським user-agent, і робити цю перевірку треба до будь-яких робіт над контентом. Коли база в порядку, фреймворк допомагає: структуровані дані, заголовки й сайтмап генеруються з тих самих сутностей, що й видимий текст, тому не розходяться між собою. У Chyzh Agency ці підходи застосовуємо в проєктах з веброзробки.

Автор: Костянтин Корягін, Backend Developer, Chyzh Agency.

Поділитися
У пошуках підрядника з розробки сайту?
Заходьте до нашого online каталогу Веб-студій та вибирайте партнера за рядом критеріїв: бал, портфоліо, відгуки, кейси та статті. Або організуйте тендер в даному каталозі, вибравши компанії, що вам сподобалися.
Більше не потрібно шукати та обдзвонювати діджитал-агентства!
Створіть тендер та отримайте пропозиції від найкращих веб-студій України.
У каталозі 1700+ діджитал-агентств, які готові допомогти в реалізації ваших завдань. Вибирайте та економте до 30% свого часу та бюджету! Це безкоштовно та займе менше 3-х хвилин.
Створити тендер
Bug