最初に書いておきますが、このページにはさくらウェブに関しての特記事項しかかかれていません。一般的なSSIやPerlの最低限の知識を身に付けてからでないと、何をいっているのか全く分からないと思いますので、SSIやPerlの入門用の本(たいていSSIとPerlで1冊になっています)を読むなりしてからこのページを見たほうがいいかもしれません。
別のサーバからさくらウェブサービスに移転した人なら分かると思うのですが、さくらウェブでSSIを使うときにはちょっとした注意が必要です。特に、以前別のサーバでSSIを使っていたりする場合は、変更しなくてはいけないところがあります。まずは、オンラインマニュアルをよく読んでください。
まず、拡張子についてですが、CGIやSSIを利用する場合は拡張子が指定されています。新規にさくらウェブでページを作る場合はそれに従えばいいですが、他のSSIが使えるプロバイダの多くはSSIでも.htmや.htmlが使えます。さくらウェブでもこのような設定にしたい場合は、wwwディレクトリの".htaccess"に、次の内容を追加してください。
AddType text/x-server-parsed-html .html
AddType text/x-server-parsed-html .html/
AddType text/x-server-parsed-html .htm
AddType text/x-server-parsed-html .htm/
これで、wwwディレクトリ以下、つまり、サイト全体でhtmlやhtmをSSIとして処理できるようになります。(※ここでの「サイト」とは、もちろんアカウント単位のサイトのことで、決してサーバ全体ではありません。)ただし、普通のHTMLファイルもSSIとして処理されるようになるので、ほんの少しだけ処理時間が余分にかかってしまいます。今回の例ではwwwディレクトリに".htaccess"を置くと書きましたが、".htaccess"はそれが置かれたディレクトリ配下のファイルに対して作用するので、ssiというディレクトリを作ってその中にこの.htaccessを入れれば、この中のファイルだけをSSI処理することができます。なるべくサーバの負担が軽くなるように工夫してください。
拡張子の問題はこれでいいのですが、もっと大きい問題があります。先ほどのオンラインマニュアルのSSIコマンドのところに、「SSIから呼び出されるコマンド文字列に、スペース文字などを含む場合エラーとなってしまいます」とあります。実際にexecコマンドを実行しようとすると、パラメータが2つ以上あってスペースが含まれる場合はexec cmd、exec cgiにかかわらずエラーメッセージが表示されます。(スクリプトのファイルが1つ目のパラメータになるので、実質、パラメータは1つも渡せなくなってしまいます。)このサイトで動作させている、Updateアイコン表示のスクリプト(update.pl)も、パラメータを必要とするので動かすことができませんでした。そこで、これの対策として、includeを使って、間接的にexecのようにCGIを動作させる方法を考えてみました。
まず、includeで読み込むCGIファイルを作ります。ファイル名はexec.cgiとしておきます。
#!/usr/local/bin/perl
# パラメータの文字列を実行
$execstr = $ENV{'QUERY_STRING'};
exec ($execstr);
exit(0);
これだけです。ただ実行するだけなので短いです。次に、exec.cgiが呼び出すPerlのSSIスクリプト(つまり、最初に呼び出そうとしていたupdate.pl)にも手を加える必要があります。update.plは、もともとSSI用だったので、ヘッダを出力するようにはできていませんでした。しかし、exec.cgiを間にはさむことによってupdate.plはCGIとして動作することになるので、CGIスクリプトのようにヘッダを出力する必要があります。ということで、update.plの2行目に
print "Content-type: text/html\n\n";
という行を追加します。
最後は、HTMLファイルでの設定方法ですが、普通のサーバで特に制限がされてなければ、
<!--#exec cmd="./update.pl param1 param2" -->
と書きたかったとすると、このexec.cgiを使って間接的に実行させるには、
<!--#include virtual="/~my_account/cgi-bin/exec.cgi?./update.pl param1 param2" -->
という感じでHTMLファイルの方に書き込むことになります。includeでは親ディレクトリに向かってさかのぼれないので、このようにvirtualを使うのが便利です。ここでは、exec.cgiもupdate.plも同じディレクトリ(cgi-bin)にあるときの例です。違うときは、update.plをcgi-binからの相対位置で指定します。(この部分を処理するのはCGIなので、ここではディレクトリをさかのぼることができます。)
これで、一通りの作業は終わりです。なお、このままではセキュリティ的にちょっと問題がある気がします。ためしにexec.cgiにlsなどの文字を送ってみたところ、エラーを出して終了しましたが、できれば自分が作成したスクリプト以外のものは絶対に通さないようにexec.cgiを強化した方がいいと思います。