HTMLからCGIを呼び出すいろいろな方法のTips その1 | to be continued ~とあるプログラマーの実験的開発日誌~

to be continued ~とあるプログラマーの実験的開発日誌~

WEBデザイナー兼プログラマーである管理人が日々のトラブル解決に向けて奮闘する開発日誌。

今回はHTMLにPerl(CGI)で出力した結果を表示させる方法について考えてみる。
と、その前に

URLで直接CGIを呼び出してブラウザに出力するプログラムのサンプル
#!/usr/bin/perl
print "Content-Type: text/html;\n\n";
print "<html>\n";
print "<head>\n";
print "</head>\n";
print "<body>\n";
print "ここに出力させたい内容";
print "</body>\n";
print "</html>\n";
exit;

1行目の「#!/usr/bin/perl」はPerlへのパスで設置サイト毎に指定されたパスを記述する必要がある。
2行目の「Content-Type: text/html」でハイパーテキスト形式、つまりブラウザで読み込める形式であることを指定している。
以下はHTMLの標準構造に沿って記述したが、表示するだけなら7行目だけでも可能。
これを「test.cgi」などのファイル名でアップロードして、ブラウザで直接アドレスを指定して呼び出してやれば表示されるはずだ。

非常に簡単な方法だが、呼び出し先がHTMLファイルではないため、場合によっては不都合なこともある。
また、この方法ではページ全体を出力するため、例えばアクセスカウンターのようにページの一部分だけを更新させたい場合には効率が悪い。
そこでHTML内にCGIの出力部分を組み込むことで、ページの一部分だけを動的に変化させることを考えてみよう。

ページの一部分だけを変えるのに最も手軽な方法は、インラインフレームを使用することだ。
つまり、先ほどの「test.cgi」をインラインフレーム内で表示させてしまえば良い。

HTMLの記述としてはこんな感じ
<iframe src="test.cgiまでのパス"></iframe>

まあ、大抵はこの方法で何とかなってしまうし、HTML表示部とCGI表示部は完全に独立しているので管理や変更もしやすい。
ただし、幾つか問題点がないわけでもない。
まず、iframeタグというのは非常に使いにくく、表示領域を自動的に調整してくれたりはしないので、表示できる大きさはあくまで固定。HTML側で指定してやらなければならない。
カウンター程度なら大きさを指定してもほとんど問題はないだろうが、内容によってはスクロールバーが表示されたりするので、完全にページと一体化させるのは難しいだろう。
また、iframe内はあくまで別ページであることにも注意が必要だ。例えばiframe内のリンクから移動した場合、リファラーはHTMLのURLではなく、CGIのURLが返ることになる。リファラーを利用したアフィリエイトリンクなどでは整合性が保てなくなる恐れがある。
こうしたことからブログパーツ配布サイトなどではJavaScriptを利用しているのをよく見かける。
確かにJavaScriptを利用してCGIを呼び出せば、表示領域を自動的に調整したり、HTMLの一部として扱われたりと便利なのだが、サーバー上で動くCGIと、ブラウザ上で動くJavaScriptでは、本来まったく性質の違うものなので、JavaScriptからCGIを呼び出すにはちょっとしたコツが必要だ。
それは次回に。