Smart SSIResolver
はじめに
Smart SSIResolver は SmartSync の追加プラグインです。
SmartSync の S3 配信時に SSI(Server Side Includes)ディレクティブを解決し、インクルードファイルの内容を結合した静的 HTML をアップロードします。Apache 環境では正常に動作する SSI を、S3 静的ホスティング環境でも同様に利用できるようにすることを目的としています。
※本プラグインは SmartSync Platform AWS専用です。SmartSync Pack単体でのご提供や販売、さくらのクラウド版でのご利用はできません。
背景
一般的な Apache 環境では以下のような SSI が利用できます。
対応バージョン
- Movable Type 8 以降
- SmartSync プラグイン 3.25 以降
主な機能
- SSIディレクティブの解決
S3へアップロードする直前に SSI を展開し、結合済み HTML を生成します。 - SSI依存関係の自動追跡
インクルードファイルが更新された場合、そのファイルを参照するページも自動的にアップロード対象へ追加します。 - 再帰的インクルード対応
インクルード先にさらに SSI が存在する場合も再帰的に解決します。 - 循環参照の検出
循環インクルードを検出し、無限ループを防止します。
SmartSyncとの違い
|
機能 |
SmartSync |
Smart SSIResolver |
|
S3配信 |
○ |
○ |
|
SSI解決 |
× |
○ |
|
SSI依存関係追跡 |
× |
○ |
|
include元変更時の再配信 |
× |
○ |
SSI依存関係の自動追跡
- Smart SSIResolverは、S3への差分配信時にSSIの依存関係を確認します。インクルードファイルが変更された場合、そのファイルを参照しているページも自動的に配信対象へ追加されるため、変更内容を反映できます。
- 全体配信(full sync)の場合は全ファイルがアップロードされるため、依存関係の追跡処理はスキップされます。
例:header.htmlを変更した場合
通常のSmartSyncではheader.htmlのみ配信されますが、Smart SSIResolverではheader.htmlを使用しているindex.html、about.html、contact.htmlも自動的に配信されます。
・通常の SmartSync:header.html のみアップロード
→ index.html, about.html は S3 上で古い header のまま
・本プラグイン適用後:header.html に加えて、
header.html を参照する index.html, about.html も自動追加
→ すべてのページが最新の header で S3 にアップロードされる
SSI ディレクティブの解決手法
S3 へのファイルアップロード時に以下の処理を行います:
- ファイル内容を検査し
<!--#include ...-->を検出 - インクルードファイルの内容を読み込んでディレクティブを置換(結合)
- 結合済みの内容を一時ファイルに書き出し、S3 にアップロード
- アップロード完了後、一時ファイルを削除
元のファイルには一切変更を加えません。FTP・Rsync 等の他の配信方式にも影響しません。
インストール
プラグインのインストールと有効化
Smart Invalidation を Movable Type の plugins ディレクトリへ配置します。特別な設定は不要です。プラグインを有効化すると、SmartSync の S3 配信時に自動的に動作します。
mt/
└── plugins/
├── SmartSync/ # 既存
└── SmartSSIResolver/ # 本プラグイン
├── config.yaml
└── lib/
├── SmartSSIResolver.pm
└── SmartSSIResolver/
└── L10N/
├── L10N.pm
├── en_us.pm
└── ja.pm
SSI対象拡張子の設定
プラグインの設定画面からSSI解決を行う拡張子を設定できます。
- ssi_target_extensions 初期値
- html,htm,shtml
使い方
1.SSIの各種設定
・virtual指定
ドキュメントルートからの絶対パスとして解決します。
・file指定
インクルード元ファイルからの相対パスとして解決します。
・ネストされたSSI
以下のような構成も利用できます。すべてのインクルードを再帰的に解決した状態で配信されます。
index.html
└ header.html
└ global-nav.html
・対応しているSSIディレクティブ
本プラグインで対応しているSSIディレクティブは以下の2種類です。
ネストされたインクルード(インクルード先にさらに #include がある場合)も再帰的に解決します。
2.パフォーマンス
Smart SSIResolver は、S3 配信時に SSI の解析と依存関係の確認を行いますが、処理内容は主にローカルファイルの読み込みと文字列置換で構成されています。
そのため、Movable Type の再構築処理のようなテンプレートコンパイルやデータベースアクセスを伴う処理と比較すると負荷は小さく、一般的なサイト規模であれば配信時間への影響は限定的です。また、全体配信時には依存関係解析を省略するなど、不要な処理を実行しないよう最適化されています。
- 差分配信時:SSI依存関係を構築するため、対象ファイルのスキャンを行います。SSIを含まないファイルは即座にスキップされるため、一般的なサイトでは数秒以内で完了します。
- 全体配信時:全ファイルが配信対象となるため、依存関係解析は実施されません
3.安全機能
- 循環参照の検出:
A.html → B.html → A.htmlのような循環インクルードを検出し、HTML コメントに置換して無限ループを防止します - ファイル未検出時の処理:インクルード先ファイルが存在しない場合はエラーにせず、HTML コメント(
<!-- SSI include not found: ... -->)に置換します - バイナリファイルの除外:Content-Type が
text/で始まるファイルのみを処理対象とします - 他の配信先への非干渉:依存関係による追加ファイルは S3 配信時のみ一時的にリストに追加され、処理後に元のリストに復元されます
4.デバッグ
Movable Type の DebugMode を有効にすると、以下の情報がログに出力されます。
- SSI を解決したファイル名
- 依存関係により追加されたファイルとその理由
- 循環参照やファイル未検出の警告
# mt-config.cgi
DebugMode 1
注意事項
- SSIファイル自体は配信される:例えば以下のような構成の場合、header.html や footer.html はインクルード用ファイルとして利用できますが、SmartSync の通常動作によりファイル自体も配信対象となります。公開したくない場合は SmartSync 側の除外設定をご利用ください。
includes/
├ header.html
└ footer.html
- 元ファイルは変更されない:SSI解決はアップロード時に生成される一時ファイルに対して行われます。配信元のHTMLファイルには変更を加えません。
更新履歴
- リリース