このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

web共有の前処理をMacPerlによるCGIで利用する方法。

発言者:Takayuki
( Date Tuesday, May 22, 2001 19:59:49 )


初めまして。いつも参考にさせていただいております。
web共有の機能であるアクションの前処理を利用して、
特定のIPからしかページにアクセスできないようにしたいのですが、
どのようにしたらいいのでしょうか。
http://mtlab.ecn.fpu.ac.jp/Webcon_archive/991102002606.html
AppleScriptによるCGIでの方法はこちらに書いてあったのですが、
MacPerlを用いた場合、どのようにしたら良いのでしょうか。

例えばこんなスクリプトを前処理に割り当てると、

$host = $ENV{'REMOTE_ADDR'};
if ($host eq "123.456.789.123")  {
    print "Content-type: text/html; charset=ISO-8859-1\n\n";
    print "<HTML><TITLE>Access Denied</TITLE>You do not have access to this document.</HTML>";
}  else  {
    print "";
}

すると、しばらくしてから
「502 Bad Gateway
CGI もしくはサーバ内部のコンポーネントがリクエストされた動作を完了できませんでした。」
となってしまいます。
許可したIP以外からアクセスすると、期待通り
「You do not have access to this document.」
となります。
「print"";」辺りが自信無いのですが。
御存知の方がいらっしゃいましたら、教えてください。
よろしくお願いします。

→  Web共有のアクション活用法

田中求之 さんからのコメント
( Tuesday, May 22, 2001 21:13:30 )

PreProcessor の場合、もし自分で処理を行わない(=サーバに処理を任せる)
場合には、ただの空文字列をリプライする必要があるのですが、Perl の
Print ""  の場合、Perl が HTTP ヘッダを自動的に付けてしまうために
うまくいかないのだと思います。

AppleScript の場合は HTTP ヘッダに至るまですべて自分で面倒をみなくては
いけないのですが、Perl の場合、print で標準出力に出力した場合、
HTTP ヘッダは Perl が面倒見ますよね(だから HTML のコンテンツの作成
だけを行えばいいようになっている)。

この部分を Perl ではコントロールできませんでしたっけ? とにかく、
HTTP ヘッダを一切付けさせないで空文字列を返すようにすれば動くはず
です。

Takayuki さんからのコメント
( Wednesday, May 23, 2001 19:47:56 )

ご回答ありがとうございました。
うまくいかない理由は理解できました。
MacPerlで空文字列だけを返す方法があるか調べてみます。

参考になりそうな記事を見つけたのですが(下記の参考ページ)
肝心のレポートへのリンクが切れていて見ることができません。
御存じの方がいらっしゃいましたらお教え願えないでしょうか。

→  HTTPサーバのレスポンスの違い

jiro さんからのコメント
( Thursday, May 24, 2001 00:04:42 )

MacPerl::Reply("")

で、行けるような気がします。
あんまりちゃんとした解決法ではない気もしますけど。

Takayuki さんからのコメント
( Thursday, May 24, 2001 11:54:21 )

御回答ありがとうございました。
「print "";」を「NacPerl::Rreply("");」
にしたら期待した動作をするようになりました。
ありがとうございました。

もうひとつ質問なのですが、このようにPreprocessorを用いるのと
以下の様にページまるごとCGIにしてしまうのでは
理論上表示速度に差がでるといったようなことはあるのでしょうか。
今は、単なるリンクのページもフィルタリングの関係上
CGIを用いたページにしているのですがなんだか気持ち悪いです。
普通のhtmlファイルにしてPreprocessorで処理した方がスマートな気がするのですが。

$host = $ENV{'REMOTE_ADDR'};
if ($host eq "123.456.789.123")  {
    print "Content-type: text/html; charset=ISO-8859-1\n\n";
    print "<HTML><TITLE>Access Denied</TITLE>You do not have access to this document.</HTML>";
}  else  {
    print "Content-type: text/html; charset=ISO-8859-1\n\n";
    print <<"EOM";
<html><head><title>MyPage</title></head>
<body>
MyPage
</body></html>
EOM
}

田中求之 さんからのコメント
( Thursday, May 24, 2001 17:33:48 )

Perl の実行速度とか、サーバのキャッシュの処理速度、あるいは処理する
ページのデータのサイズ、さらには、アクセスがどの程度重なるのか、
など複数の要因が関係しますので、ご自分の環境で試してみてください
としかいいようがないんですよ。

ただ、PreProcessor は、ページだけに限らず、画像等のデータへのアクセス
の場合も、すべてのアクセスが通ることになりますので、その点には注意して
実装してください(こういう点を考えると、サーバになるべく任せる実装
の方が良いと思います)

Takayuki さんからのコメント
( Thursday, May 24, 2001 18:55:16 )

ご回答ありがとうございました。
確かに画像が多いページには不向きなようですね。
おかげでpreprocessorのはたらきを大分理解できるようになってきました。