Бесплатный SEO-аудит (seo:audit)
php artisan seo:audit бесплатно отвечает одной командой на вопрос: что сейчас не так с моим SEO? Он перебирает модели HasSEO внутри процесса — без очереди, лицензии и сети — и выводит таблицу pass / warn / fail по страницам со сводкой.
php artisan seo:audit+--------------+--------+----------------------------+
| Page | Status | Findings |
+--------------+--------+----------------------------+
| Post #1 | PASS | — |
| Post #2 | WARN | notice title_too_short |
| Post #3 | FAIL | critical missing_title |
| | | warning missing_description|
+--------------+--------+----------------------------+
3 page(s) — 1 passed, 1 warned, 1 failed
4 issue(s) — 1 critical, 1 warning, 2 noticeЧто проверяется
Аудит выполняет только класс metadata: проверки, которым достаточно модели и резолвера, без загрузки страницы:
| Проверка | Коды |
|---|---|
| Наличие заголовка / описания с учётом резервных значений | missing_title, missing_description |
| Наличие OG-изображения с учётом резервных значений | missing_og_image |
| Длина заголовка / описания | title_too_long, title_too_short, description_too_long, description_too_short |
| Повторяющиеся заголовки / описания на сайте | duplicate_title, duplicate_description |
| Конфликты robots и подозрительный noindex | robots_conflict_indexing, robots_conflict_following, noindex_warning |
| Формат канонического URL / другой домен / общий URL / незащищённый URL | invalid_canonical, cross_domain_canonical, shared_canonical, insecure_canonical |
| Готовность к ответам (AEO): структурированные данные статьи | aeo_missing_author, aeo_article_missing_date |
| Наличие фокусного ключевого слова (по желанию) | missing_focus_keyword |
| Альтернативные версии hreflang (реестр ядра, если страница их объявляет) | hreflang_invalid_code, hreflang_duplicate_code, hreflang_missing_self |
Большинство кодов встречается и в сканировании Pro, но реестры раздельные. В частности, ядро использует hreflang_missing_self, а Pro — hreflang_missing_self_reference; hreflang_duplicate_code имеет уровень notice в ядре и warning в Pro. Одинаковое имя не означает одинаковый охват или серьёзность. blank_explicit_override принадлежит реестру ядра. Для длины применяется лимит редактора по письменности: 60/160 символов для латиницы, около 30/80 для CJK, в графемах и по итоговому значению с суффиксом. Поэтому аудит не противоречит счётчикам редактора Filament. Проверки hreflang работают со списком после политик seo.hreflang — тем же, который выводят теги и карта сайта. Проверка взаимности требует обхода и остаётся в Pro.
Проверки готовности к ответам (AEO) срабатывают только при объявленном JSON-LD типа статьи (Article, BlogPosting, NewsArticle, …), в котором отсутствует признак, делающий статью понятной через структурированные данные: сущность author (явное авторство / происхождение) либо datePublished / dateModified (явная временная история). Страница без статьи никогда не отмечается, поэтому аудит не создаёт замечаний там, где AEO неприменимо. Это рекомендации уровня notice, исключённые из оценки Pro 0–100.
Что не проверяется: границы возможностей
Бесплатный аудит внутри процесса не эквивалентен полному сканированию Pro, и команда сообщает об этом при каждом запуске. Он не выполняет:
- Проверки отрендеренного HTML —
missing_h1,multiple_h1,missing_image_alt,thin_content,mixed_content. Им нужен отдаваемый HTML страницы. - Сетевые проверки канонических целей —
canonical_target_broken/_redirect/_noindex. Им нужен исходящий защищённый запрос. - Числовую оценку 0–100. Оценка — функция Pro, сохраняемая в результате сканирования вместе с версией методики; см. SEO-оценку.
Эти возможности входят в сканирование Pro; см. полный реестр проблем.
Выбор объектов аудита
По умолчанию команда проверяет модели из seo.audit.models, а при отсутствии использует seo.sitemap.models:
// config/seo.php
'audit' => [
'models' => [
\App\Models\Post::class,
\App\Models\Page::class,
],
],Или передайте модели явно:
php artisan seo:audit --model="App\Models\Post" --model="App\Models\Page"Параметры
| Параметр | Действие |
|---|---|
--model= | Класс модели с HasSEO для аудита (можно повторять). Переопределяет конфигурацию. |
--locale= | Определяет итоговые данные SEO в этой локали (по умолчанию локаль приложения). |
--limit= | Максимум записей на модель (0 = все). |
--issues-only | Показывает только страницы хотя бы с одной проблемой. |
--strict | Завершает с ненулевым кодом при любой найденной проблеме — для CI. |
--json | Выводит машиночитаемый JSON (страницы, сводка, охват) вместо таблицы. |
Обязательная проверка CI
--strict превращает аудит в проверку сборки:
php artisan seo:audit --strictКод завершения — 1, если у любой страницы предупреждение или ошибка, и 0, если все проверенные страницы прошли.
JSON
php artisan seo:audit --json{
"pages": [
{
"model": "App\\Models\\Post",
"key": 3,
"label": "Post #3",
"url": "https://example.com/blog/...",
"status": "fail",
"issues": [
{ "code": "missing_title", "severity": "critical", "field": "title", "message": "Page is missing a title tag." }
]
}
],
"summary": { "pages": 3, "passed": 1, "warned": 1, "failed": 1, "issues": 4, "by_severity": { "critical": 1, "warning": 1, "notice": 2 } },
"skipped": [],
"coverage": { "executes": "metadata", "note": "...", "reference": "https://rankbeam.dev/pro/scan-issues" }
}Фокусные ключевые слова
Замечание missing_focus_keyword по умолчанию выключено. Оно появляется только после включения работы с фокусными ключевыми словами:
// config/seo.php
'keywords' => [
'enabled' => true,
],Сканирование Pro читает тот же флаг, поэтому аудит, сканирование и напоминание редактора Pro всегда согласованы. Задайте ключевые слова страницы через поле Filament или $model->saveSEO(['focus_keywords' => [['keyword' => 'laravel seo', 'is_primary' => true]]]).
Если значение неожиданно: seo:explain
seo:audit говорит, что не так; seo:explain — почему поле получило именно такое значение: какой слой (конфигурация / значение по умолчанию / вычисляемое / явное) его задал, что переопределил и какая постобработка (суффикс заголовка, очистка канонического URL, защита от индексации) изменила его позже. Используйте команду, когда результат аудита или выведенный тег удивляет:
php artisan seo:explain "App\Models\Post" 42