.htaccess活用法(11)

.htaccess(拡張子がhtaccessということで、ドットが必要です。ファイル名がないので最初戸惑いますが、こういうものだと思ってください。)が利用可能だと、

11.SSIを「.html」で動かす

AddTypeによるMIMEタイプの設定の応用例は他にもあります。SSI(Server Side Include)を「.html」という拡張子のファイルでも動くようにしてみましょう。

SSIは非常に便利です。PHPが利用できるまで、私も結構使っていました。このSSIを利用する上で一番ネックに思ったのが、「.shtml」という拡張子で作成しなければならないことでした。気をつければ何ていうことはないのですが、よく「.html」で作成してしまい、「あれ。動かないぞ。何で〜」となっていたことがあります。

もし、.shtmlではなく.htmlでSSIが動くようにしたいのであれば、.htaccessを使って、

AddType text/x-server-parsed-html .html

とします。しかし、これだと、単純なHTMLファイルでも、いちいちSSIとして処理されますから、サーバに高い負荷を与えます。「どうしても」という場合を除き、避けたほうが良いでしょう。

代替案としては、iframeやJavascriptの利用が挙げられます。例えばバナー広告ローテーションをSSIで、

<!--#exec cgi="./cgi-bin/banner.cgi" -->

としていたならば、その代わりに、

<IFRAME frameBorder="0" allowTransparency="true" height="60" width="468" marginHeight="0" scrolling="no" src="http://www.example.com/cgi-bin/banner.cgi" MarginWidth="0"><a href="http://www.exapmle.com/destination1.html"><img src="http://www.example.com/image/banner1.jpg" width=468 height=60 border=0></a></iframe>

などとします。iframeをサポートしていないブラウザのシェア(ネットスケープ4.Xなど)は、私のサイトへのアクセスログによれば、今では約2%程度ですが、iframeをサポートしていないブラウザのためにも、「<iframe>」と「</iframe>」の間に、サポートしていないブラウザのためのコードも忘れずに書いておきます。(もちろん、iframeをサポートしていないブラウザでは、SSIに変わる完全な表現方法がない場合もあるとは思いますが・・・。)

iframeではなく、Javascriptでも可能です。バナー広告を掲載した箇所に

<script type="text/javascript" src="banner_js.cgi"></script>
<noscript><a href="http://www.exapmle.com/destination1.html"><img src="http://www.example.com/image/banner1.jpg" width=468 height=60 border=0></a></noscript>


とした上で、banner_js.cgiの中身は、下記のようにします。

#!/usr/bin/perl

$now = time(); #乱数を発生させるため、時間を取得
if($now % 3 == 1){ #3で割って1余るならば
    $ad = '<a href="http://www.example.com/destination1.html"><img src="http://www.example.com/image/banner1.jpg" border=0 width=468 height=60></a>';
} elsif($now % 3 == 2){
    $ad = '<a href="http://www.example.com/destination2.html"><img src="http://www.example.com/image/banner2.jpg" border=0 width=468 height=60></a>';
} else {
    $ad = '<a href="http://www.example.com/destination3.html"><img src="http://www.example.com/image/banner3.jpg" border=0 width=468 height=60></a>';
}
#Javascriptファイルであるというヘッダーを発行
print "Content-Type: application/x-javascript\n\n";
#Javascriptファイルの中身をそのままprintする。
print "document.write('$ad');";
exit;
のようになります。

ここで、ポイントは、「print "Content-Type: application/x-javascript\n\n";」とMIMEタイプをヘッダーで指定してあげることです。

「CGI = Content-type: text/html\n\n」と思い込んでいたり、Javascriptの外部ファイルの拡張子は「.js」と決め付けている限り、この発想は出てこないと思います。私も長らく、固定概念から抜け出ることができませんでした。


なお、<script type="text/javascript" src="banner_js.cgi"></script>のbanner_js.cgiを絶対URLを指定してダウンロードしようとすると、Windows版IE6.0では、banner_js.jsというファイルのダウンロード画面になり、その中身は、

    document.write('<a href="http://www.example.com/destination3.html"><img src="http://www.example.com/image/banner3.jpg" border=0 width=468 height=60></a>');
と一行あるのみです。document.writeにより、バナー広告が表示されることになります。

ただ、Javascriptをoffにしているユーザー(私のサイトの統計によれば約3%)もいますから、Javascriptがoffでもバナー広告が表示されるように、デフォルトのバナー広告を決め、それを「<noscript>」と「</noscript>」の間に挟まれた箇所に記述します。ただ、どのようなSSIでもこのJavascript方式で代替できるかといえば、そういうこともありません。noscriptタグの中に記述するHTMLタグで、全てのSSIの代替表現を記述することは不可能でしょう。

ですが、先述のiframeとこのJavascriptを組み合わせることで、かなりの確率(99.9%以上)でSSIの代わりを表現することが可能でしょう。iframeタグをサポートしないブラウザ用に記述するHTMLタグの部分に<script type="text/javascript" src="banner_js.cgi"></script>と記述し、さらに続いて「<noscript>〜</noscript>」を記述します。これにより、SSIで表現できない内容があったとしても、iframeをサポートしていないブラウザでアクセスしていて、かつJavascriptをoffにしている人だけがnoscriptタグの中身を読み込みます。1000人に1人いるかいないかですから、ここは単純に「恐れ入りますが、Javascriptをoffにされているので表示できません。」でも良いかもしれません。

--広告--
【PR】 ネットショップを始めるなら、独自ドメイン無料!の
e-shopsカート2レンタルサーバ付プラン

【PR】 PEPABO WiMAX(ペパボワイマックス)

【PR】 おすすめレンタルサーバー 『GMOクラウドのiCLUSTA+』


このiframeタグとJavascriptの組み合わせは、何を隠そう(ちょっとオーバー)、アフィリエイトプログラムの王様・バリューコマースが採用しているバナー広告タグであり、これは非常に良く出来ていると思います。iframeを利用することにより同一の形式の広告タグでflash広告も可能にしています。もちろん、サーバサイドプログラムで「application/x-shockwave-flash」というMIMEタイプをヘッダー出力しているのだろうと思います。普通のGIF広告なら「image/gif」を使い、flashの場合は「application/x-shockwave-flash」を出力するという形で、見事に切り分けが可能です。flash広告をiframeを使わずに記述しようとすると、flashプラグインの有無を判別するコードなどを書かなければならないため、非常にボリュームが大きくなりがちで、これをそのままウェブマスターに配布するのは不適ですから、flashなどのマルチメディア広告を採用するならiframe+javascriptの採用は、よく考えられた手法だと思います。決して、バリューコマースをよいしょするわけではありませんが、そう思います。ちなみに某検索エンジン大手では、flash広告にJavascriptの外部ファイルを利用しているようです。

話が逸れましたが、SSIにはこのように代替手段もありますから、セキュリティ上の理由からSSIが利用できないサーバを利用している場合も、上のような方法で利用してみると良いかもしれません。また、最近では、PHPの利用できるレンタルサーバも増えていますから、そのようなサーバを利用してみるのも良いかもしれません。PHPであれば、SSIのように埋め込み型でプログラムを記述でき、HTMLと融合するのが簡単です。また、一般にCGI(perl)よりも負荷が少なく、高速だと言われています。


▼ AddType ディレクティブ
http://httpd.apache.org/docs/mod/mod_mime.html#addtype

以上、.htaccessの実践的な利用法について見てまいりました。最後に、.htaccessが利用可能なレンタルサーバについてご紹介します。