5分で分かる SSI を忘れていた人が SSI+Perl の便利さを思い出せる記事を書いたよ
PHPの便利さが5分でわかるのが面白かったらしく、
http://weble.org/2010/12/28/php-beginner
からerbやPythonなどいろいろ派生したので、ここらでだいぶ原点回帰。
SSIとPerlでもちょっとは5分便利シリーズとして有効だよということで参戦。
SSIはApacheで使えるサーバサイドインクルード。
一時期、サーバで任意のコマンドが実行出来るからセキュリティが云々という、なんとも不当な理由(PHPでsystem関数動かせるのに、SSIでコマンド実行はできないとか意味不明なレンタルサーバもあったような...)で冷遇されてきましたが、VPSが安くなったいま、俺の環境で勝手にやるんだから文句ないだろ、え? ということで、SSIを見直してみるのも悪くないです。
AddType text/x-server-parsed-html .html Options +Includes
最近のApacheだと、MIMEタイプに割り込むことなく、こういうふうに書くそうです。
AddOutputFilter INCLUDES .html Options +Includes
あとはもう、HTMLファイルに特殊なコメントを入れるだけ。
SSIだってナメちゃいけません。使うのと使わないのとじゃ、雲泥の差です。PHPはムリでも、SSIなら許すなんていうお仕事も、この時代になっててもまれに実在します。
コピーライトの西暦を自動更新
SSIオンリーで完結します。
<!--#config timefmt="%Y" --> Copyright (c) 2010-<!--#echo var="DATE_LOCAL" --> Weble inc. All Rights Reserved.
時刻フォーマットを年だけにして、時刻を表示すれば終了。時刻やファイルサイズなどはSSIがダイレクトにサポートしているので調べてみるといいかもしれません。
自分の年齢を自動更新
演算が必要になるとさすがに何かの言語に仕事してもらわないといけません。ここではPerlを使います。
<!--#exec cmd="./inc/userpg.pl" -->歳
そのスクリプトの実体は...
#!/usr/bin/env perl ($_, $_, $_, $nd, $nm, $ny) = localtime(time); ($bd, $bm, $by) = (10, 0, 1975 - 1900); print $ny - $by - ($nm < $bm || $nm == $bm && $nd < $bd);
もちろんですが、 chmod 755 していないとだめです。でも、スクリプトが実行できないレンタルサーバもあるので、うまくいく保証はありません。そいいうときはVPSにしなかった自分を呪いましょう。
ページの部品を読み込む
これはSSIの本業ですよね。はい、とっても簡単で、しかも他のどんな環境より軽量です。部品を読み込むだけだということがわかっているなら、本気でSSIが妥当ですね。
<!--#include file="./inc/header.html" --> <div id="contents"> テキストテキストテキスト </div> <!--#include file="./inc/footer.html" -->
ユーザがアクションしないWebサイトだと、SSIで読み込むファイルをcronで定期的に更新するなんていうのが、実は現実的だったりします。
セキュリティについて少し
部品として使われたり、外部のスクリプトとして使われるファイルは、直接アクセス可能になっているべきではありません。インクルードされるファイルがあるフォルダにまとまっているとしたら、そこには当然、こんな .htaccsess ファイルを置いておくべきです。つまり、外部からのあらゆるアクセス禁止、と。
Deny All
他のサイトのコンテンツを読んだり、カレンダーを作ったりは... パスしますw
すでに上の例から、「理論的には可能」だし。
SSIを主役にした話で、そんな高級な機能はちょっと微妙ですね。もしやりたいなら、それこそ、Perlでなくても、CLIのPHPでも、Rubyでも、何でも好きなスクリプト言語(それが嫌ならネイティブの機械語でもいいし)を使えるので、それで実装してコマンドラインでテストができたら、あとは exec cmd でその出力結果を読み込めばいいだけ。
まあ... もし許されるなら、ある程度プログラムが書けるPHPのほうが、やっぱりずっといいですね。でも、PHPが使えない場合に、じゃあせめてSSIを... と食い下がることができたら、全ページスタティックと比べて、だいぶ楽チンさが違うと思います。という意味で、SSI、ちょっと知っていてもいいんじゃないかな、と。
参考リンク http://httpd.apache.org/docs/2.2/ja/mod/mod_include.html