SSI (Server Side Includes) は、HTML の中に書いた特別なコメントを、サーバーが送信の直前に処理する仕組みです。共通のヘッダーやフッターを別のファイルにしておき、各ページから読み込めます。Apache では mod_include というモジュールが担当し、標準的な設定では、拡張子が .shtml のファイルだけが処理されます。ここでは XAMPP (Apache や PHP などをまとめて入れられる、手元の開発環境) を例に、.html のファイルでも SSI を使う設定を紹介します。
SSI の書き方
読み込みたい場所に、次のように書きます。
<!--#include virtual="/inc/header.html" -->
<main>
<p>ページごとの内容</p>
</main>
<!--#include virtual="/inc/footer.html" -->
virtualには URL のパスを書きます。/で始めると公開フォルダーのいちばん上から、/で始めないと今のページからの相対的な位置になりますfileという書き方もありますが、../を含められず、上の階層のファイルを読み込めません。公式の資料でもvirtualを使うよう勧めています- 書き始めの
<!--#は 1 つのまとまりなので、あいだに空白を入れません。逆に、終わりの-->の前には空白を入れておきます
SSI が無効のままだと、この行はただの HTML のコメントとして送られ、画面には何も表示されません。表示されないときは、ブラウザーでページのソースを開き、コメントがそのまま残っていないかを確かめます。
httpd.conf で .html を有効にする
XAMPP の Apache の設定ファイルは、標準では C:\xampp\apache\conf\httpd.conf にあります。まず、mod_include が読み込まれているかを確かめます。
LoadModule include_module modules/mod_include.so
この行の先頭に # が付いていればコメントになっているので、外します。
Apache の標準的な設定ファイルには、.shtml 用に次の 2 行が用意されています (コメントになっていることもあります)。
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
AddType は、拡張子と MIME タイプ (ファイルの種類を表す名前) の対応を決める指定です。.shtml は標準では HTML として扱われないので、この行が要ります。AddOutputFilter INCLUDES は、その拡張子のファイルを SSI の処理 (INCLUDES フィルター) に通す指定です。
.html でも有効にするには、公開フォルダーの <Directory> の設定の中に、次の 2 行を書き加えます。
<Directory "C:/xampp/htdocs">
# (既存の設定はそのまま残す)
# SSI を許可する
Options +Includes
# .html を SSI の処理に通す
AddOutputFilter INCLUDES .html
</Directory>
.html はもともと text/html として扱われるので、AddType は書かなくても動きます (書いても問題はありません)。設定を変えたら、XAMPP のコントロールパネルで Apache を停止し、起動し直します。
.htaccess で有効にする
設定ファイルを編集できないレンタルサーバーなどでは、.htaccess に書きます。
Options +Includes
AddType text/html .html
AddOutputFilter INCLUDES .html
.htaccess で Options を使うには、サーバー側の AllowOverride で Options が許可されている必要があります。AddType や AddOutputFilter には FileInfo の許可が要ります。許可されていない指定を書くと、ページ全体が「500 Internal Server Error」になります。使えるかどうかはサーバーしだいなので、サーバー会社の説明を確かめてください。
XBitHack で、必要なファイルだけを処理する
AddOutputFilter INCLUDES .html では、すべての .html が SSI の処理を通ります。SSI を使っていないページの中身も調べるので、そのぶん少し遅くなります。対象を絞りたいときは、XBitHack を使う方法があります。
Options +Includes
XBitHack on
XBitHack on にすると、MIME タイプが text/html のファイルのうち、所有者の実行権限 (x ビット) が付いたものだけを SSI として処理します。Linux などのサーバーでは、SSI を使うファイルにだけ実行権限を付けます。
# SSI を使うファイルにだけ、所有者の実行権限を付ける
chmod u+x index.html
Windows のファイルには、Linux のような実行権限の x ビットが無いため、Windows で動かす XAMPP では、この方法は使いにくいです。
注意点と、今の選択肢
- SSI には、サーバーのコマンドを実行する
execという命令もあります。使わないなら、Options +Includesの代わりにOptions +IncludesNOEXECを指定すると、execが無効になって安全です - SSI で組み立てたページは、標準では
Last-Modifiedヘッダーが送られないため、ブラウザーなどにキャッシュされにくくなります。必要ならSSILastModifiedなどの指定で調整します - 手元の環境と公開するサーバーで SSI の設定がそろっていないと、公開したとたんに共通部分が表示されない、ということが起きます
共通部分をまとめる方法は、SSI だけではありません。Hugo などの静的サイトジェネレーター (テンプレートと原稿から HTML を前もって作る道具) を使えば、公開前に HTML を組み立てておけるので、サーバーの SSI の設定に左右されません。PHP が使えるサーバーなら、PHP の include で読み込む方法もあります。サーバーの設定を変えられないときや、ページ数が多いときは、こうした方法も検討するとよいでしょう。
まとめ
- SSI は、
<!--#include virtual="..." -->で共通の部品をサーバー側で読み込む仕組み - .html でも有効にするには、
Options +IncludesとAddOutputFilter INCLUDES .htmlを書く - .htaccess で使えるかどうかは、サーバーの
AllowOverrideの設定しだい - 対象を絞るなら
XBitHack、execを使わないならIncludesNOEXEC - 公開前に HTML を組み立てる静的サイトジェネレーターも選択肢になる