無料のSEO監査(seo:audit)
php artisan seo:auditは、今、SEOのどこに問題があるのかという問いに、1つのコマンドで無料で答えます。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 | invalid_canonical, cross_domain_canonical, shared_canonical, insecure_canonical |
| 回答への対応度(AEO)— 記事の構造化データ | aeo_missing_author, aeo_article_missing_date |
| フォーカスキーワードの設定(明示的に有効化) | missing_focus_keyword |
| hreflangの代替ページ(Coreのレジストリ。ページに設定がある場合) | hreflang_invalid_code, hreflang_duplicate_code, hreflang_missing_self |
多くのコードはProのスキャンにもありますが、レジストリは別です。特に、Coreではhreflang_missing_self、Proではhreflang_missing_self_referenceを使います。hreflang_duplicate_codeはCoreではnotice、Proではwarningです。同名でも検査範囲や重大度が同じだとは考えないでください。blank_explicit_overrideはCoreのレジストリに属します。長さはエディターの文字体系別の目安を使います。ラテン文字は60/160文字、CJKは約30/80文字で、書記素単位で数え、サフィックスを含む解決済みの値を測定します。そのため、監査結果と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が必要です。 - 実際の正規URLへのネットワーク検査 —
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 | 問題が1つ以上あるページだけを表示します。 |
--strict | 問題が1つでもあれば、0以外の終了ステータスを返します。CI向けです。 |
--json | 表の代わりに機械可読のJSON(ページ、概要、検査範囲)を出力します。 |
CIでのチェック
--strictを使うと、監査をビルド時のチェックにできます。
php artisan seo:audit --strict警告または失敗のページが1つでもあれば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のnoticeはデフォルトでは無効です。フォーカスキーワードのワークフローを明示的に有効にした場合だけ表示されます。
// 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