バックエンド 2025.12.30

Laravel APIのSEO対策!ヘッドレス構成でGoogle対応する実践術

約10分で読めます

ヘッドレスCMSとLaravel APIでSEO効果を最大化する方法を解説。実際のクライアント事例から学ぶ、Googleアップデート時代の最適化テクニック。

こんな悩みはありませんか?

「Laravel APIを使ったヘッドレス構成でサイトを構築したけれど、SEO効果が思うように出ない」「フロントエンドはReactやNext.jsで高速なサイトが作れたものの、検索エンジンからの集客が伸び悩んでいる」

このような課題を抱えている企業様が増えています。特に最近のGoogleアップデートでは、Core Web VitalsやPage Experience Updateなど、技術的な要素がSEOに大きく影響するようになりました。

実案件で見えてきた課題

先日、横浜の製造業のクライアント様からこんな相談を受けました。「Laravel APIとReactで高性能なサイトを作ったのに、検索順位が上がらない。むしろ前のWordPressサイトの方が良かった」

調査してみると、以下のような問題が見つかりました:

  • サーバーサイドレンダリング(SSR)の未実装でクローラーがコンテンツを正しく認識できない
  • メタデータの動的生成が適切に行われていない
  • 構造化データの出力が不完全
  • 画像の最適化がフロントエンド任せになっている

Laravel APIでSEO対応する実践的アプローチ

1. APIレスポンスにSEOメタデータを含める

まず、Laravel API側でSEO用のメタデータを適切に管理します。

// app/Http/Controllers/Api/ArticleController.php
class ArticleController extends Controller
{
    public function show($slug)
    {
        $article = Article::where('slug', $slug)->first();
        
        return response()->json([
            'data' => $article,
            'seo' => [
                'title' => $article->seo_title ?? $article->title,
                'description' => $article->meta_description,
                'canonical_url' => url("/articles/{$article->slug}"),
                'og_image' => $article->featured_image_url,
                'structured_data' => $this->generateStructuredData($article),
                'keywords' => $article->keywords,
            ]
        ]);
    }
    
    private function generateStructuredData($article)
    {
        return [
            '@context' => 'https://schema.org',
            '@type' => 'Article',
            'headline' => $article->title,
            'author' => [
                '@type' => 'Person',
                'name' => $article->author->name
            ],
            'datePublished' => $article->published_at->toISOString(),
            'dateModified' => $article->updated_at->toISOString(),
        ];
    }
}

2. 画像最適化をAPI側で処理

画像のSEO対策もLaravel側で対応します。

// app/Http/Resources/ImageResource.php
class ImageResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'src' => $this->url,
            'alt' => $this->alt_text ?? $this->title,
            'width' => $this->width,
            'height' => $this->height,
            'webp_src' => $this->getWebPUrl(),
            'sizes' => $this->getResponsiveSizes(),
        ];
    }
}

3. サイトマップAPI の実装

// routes/api.php
Route::get('/sitemap', [SitemapController::class, 'index']);

// app/Http/Controllers/Api/SitemapController.php
class SitemapController extends Controller
{
    public function index()
    {
        $pages = collect();
        
        // 記事ページ
        Article::published()->each(function ($article) use ($pages) {
            $pages->push([
                'url' => url("/articles/{$article->slug}"),
                'lastmod' => $article->updated_at->toISOString(),
                'priority' => '0.8',
                'changefreq' => 'weekly'
            ]);
        });
        
        return response()->json(['pages' => $pages]);
    }
}

フロントエンド側での最適化

Next.js での実装例

// pages/articles/[slug].js
import Head from 'next/head';

export default function Article({ article, seo }) {
  return (
    <>
      <Head>
        <title>{seo.title}</title>
        <meta name="description" content={seo.description} />
        <link rel="canonical" href={seo.canonical_url} />
        <meta property="og:title" content={seo.title} />
        <meta property="og:image" content={seo.og_image} />
        <script 
          type="application/ld+json"
          dangerouslySetInnerHTML={{
            __html: JSON.stringify(seo.structured_data)
          }}
        />
      </Head>
      
      <article>
        {/* コンテンツ */}
      </article>
    </>
  );
}

export async function getServerSideProps({ params }) {
  const response = await fetch(`${process.env.API_URL}/articles/${params.slug}`);
  const { data: article, seo } = await response.json();
  
  return {
    props: { article, seo }
  };
}

失敗談から学んだ注意点

実装時に気をつけるべき「やりがちなミス」をご紹介します:

1. API レスポンスの重複

初期実装では、SEOデータを毎回フルで返していたため、レスポンスが重くなってしまいました。必要な場面でのみ詳細なSEOデータを返すよう調整が必要です。

2. キャッシュ戦略の見落とし

動的なメタデータ生成により、サーバー負荷が増大。Redisを使ったキャッシュ機能を追加しました。

// キャッシュを活用したSEOデータ取得
public function getSeoData($article)
{
    return Cache::remember("seo_article_{$article->id}", 3600, function () use ($article) {
        return $this->generateSeoData($article);
    });
}

3. モバイル対応の遅れ

Core Web Vitalsの改善に注力するあまり、モバイルでの表示速度最適化が後回しになったケースもありました。

実際の成果と改善結果

前述のクライアント様では、これらの対策により:

  • 検索流入が3ヶ月で40%増加
  • Core Web Vitalsスコアが平均80点台に改善
  • 問い合わせ数が月間15件から24件に増加

という結果を得ることができました。

まず何から始めるべきか

ヘッドレス構成でのSEO対策は一度に全てを実装する必要はありません。以下の優先順位で進めることをお勧めします:

  1. 現在のSEO課題を洗い出し(Google Search Consoleの活用)
  2. APIレスポンスにメタデータ追加(比較的簡単で効果大)
  3. 構造化データの実装(検索結果の表示改善)
  4. 画像最適化とCore Web Vitals改善

まとめ

Laravel APIとヘッドレス構成でのSEO対策は、適切なアプローチにより従来のWordPressサイト以上の効果を期待できます。重要なのは、技術的な実装だけでなく、ビジネス目標に合わせた戦略的な取り組みです。

横浜のFivenine Designでは、20年以上の実績を活かし、Laravel APIを使った本格的なSEO対策をご提案しています。「うちのサイトでも効果が出るか相談したい」という方は、お気軽にお問い合わせください。一緒に検索エンジンからの集客を改善していきましょう。

この記事をシェア