本文へスキップ
Build

Column

コラム

制作者向け / 更新

HTML共通パーツのインクルード化:PHP・JS・Astroの使い分け方

この記事には広告リンクを含みます。紹介している商品・サービスの一部はアフィリエイトプログラムを利用しています。 商品・サービスの選定はご自身の判断でお願いいたします。

HTML共通パーツのインクルード化:PHP・JS・Astroの使い分け方 のアイキャッチ

ヘッダーとフッターを別ファイルに切り出して各ページから読み込む——静的HTMLの共通パーツインクルードは、制作者なら一度は直面する実装課題です。
「JavaScriptで実装したがローカルで動かない」「PHPに切り替えたらパスがずれる」という詰まり方には、どれも構造的な原因があります。
結論から言うと、「file://プロトコルのCORS制限」と「PHPパスの設計タイミング」が問題の根本です。
2026年の案件環境では、この両方を構造的に回避できるAstroコンポーネントが小規模案件の実用解になってきています。

JavaScriptのfetch()がローカルで動かない理由とSEOリスク

静的HTMLのファイル構成を整える作業机のイメージ

fetch()やXMLHttpRequestでHTMLファイルを読み込む実装は、ローカル環境(file://)では動作しません。
ブラウザのCORSポリシーが、file://プロトコルからのリクエストをブロックするためです。

なぜ動かないのかを理解せずに進むと、本番環境に上げてから別の問題が出てきます。
XHRとfetch()は書き方が違いますが、どちらも非同期HTTPリクエストなのでCORS制限は同様にかかります。

ローカル確認の回避策として、自分がよく使うのは次の方法です。

  1. VS CodeのLive Server拡張でローカルサーバーを起動する
  2. npx http-serverでnpm製の簡易サーバーを立てる
  3. PHP環境があればphp -S localhost:8000で代用する

SEOへの影響も要確認。
Googlebotはクローリング時にJavaScriptを実行しますが、レンダリングには遅延があります。
ヘッダー・フッターがJSで後から差し込まれる構造では、インデックス反映まで時間がかかる可能性があります。
静的HTMLでマークアップしておくほうが、SEO上の不確実性を減らせます。
ただし、PHPが使えないホスティング環境では選択肢が限られるため、その場合はAstroコンポーネントが現実的です。

PHP・JS・SSI・Astroコンポーネントを案件規模で選ぶ

手法の選択基準は2軸。案件のホスティング環境規模感で決まります。

手法

向いている案件

注意点

PHP include

中〜大規模・PHP対応サーバー

ページ構成確定後に着手

JSfetch()

簡易構成・サーバーなし前提

ローカルCORS・SEO遅延に注意

SSI

Apache環境・既存構成に合わせる

設定必要・モダン案件では減少

Astroコンポーネント

小規模新規・LP・ポートフォリオ

ビルドステップが必要

案件の初期段階でどの手法を選ぶかを決めておくと、後から大きな修正が発生しにくくなります。

以前関わったLP案件でAstroを初めて使った際、ヘッダー・フッターをコンポーネント化しました。
その結果、JSインクルード特有のfile://CORS問題が最初から発生しませんでした。
AstroはビルドでHTMLを静的生成するため、実行時のfetch()リクエスト自体が不要になるからです。
ただし、特殊な階層へのデプロイ時にはtsxの相対パス設計で詰まったため、デプロイ先の構造は事前に確認が必要です。

AstroとWordPressのどちらを選ぶかの判断基準は、AstroとWordPressの使い分け:迷わない3つの判断基準にまとめています。

PHPインクルードを後から入れるときのパス設計の落とし穴

PHPのinclude()はサーバーサイドで処理されるため、JSインクルードのようなSEOリスクはありません。
ただし、既存の静的サイトに後からインクルード化を導入する場合、ページ構成が確定していないと全修正になります。

以前関わった数十ページ規模のリニューアル案件では、仕分けの段階で3〜4割のページが削除・統合の対象になりました。
インクルードパスを再構成前に設計すると、ページを移動するたびにinclude()の相対パスを全て修正しなければなりません。

PHPインクルードのパス設計で確認するポイントをまとめます。

  • ページ構成(URL設計)が確定してからインクルード化に着手する
  • 相対パスより$_SERVER['DOCUMENT_ROOT']経由の絶対パスで書く
  • 階層が混在する場合は特に相対パスの書き方に注意する

絶対パスで書くと次のようになります。

<?php include($_SERVER['DOCUMENT_ROOT'] . '/include/header.php'); ?>

ルートからの絶対パスで統一しておくと、ページを別ディレクトリに移動しても修正が1箇所で済みます。
相対パスで書いた場合、/about//about/team/では階層が異なり、同じinclude文が一方で動かなくなります。

まとめ

  • JSのfetch()インクルードはfile://環境で動かない——ローカル確認にはローカルサーバーが必要です
  • SEO上の不確実性を避けたいなら、静的生成かPHPインクルードを選びます
  • 小規模LP・静的サイト案件では、AstroコンポーネントがCORSとSEO不確実性を構造的に回避できます
  • PHPインクルードを後から入れる場合は、ページ構成確定後に着手するのが基本です

コーディング代行・実装判断で詰まったら Build に振ってください。
HP制作・保守・改修で悩んでいる方も、一度 Build にご相談ください。