重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

当方perlの知識はないので困っております。
あるオープンソースのcgiを使っているのですが

cgiファイルが呼び出すhtmlファイルにJavaScriptで記述された
アクセス解析の記述をしたのですが、うまくいきません。

アドレスを見ると×××.cgiのままとなっており、表示するhtmlの中に
JavaScriptの記述を埋め込んでいるという形になります。

<script type="text/javascript">
document.write("<img src=http://・・・/index.cgi?page=XXXX&r=" + document.referrer + ">");
</script>

最初に表示されるときはlogへの書き込みがなされないのですが
更新ボタンを押すと書き込みがされます。
この記述をヘッダーの中に入れたり、外部で呼び出したりいろいろやりましたがすべて同じような挙動になります。


cgiファイルの中身の最後の方はこうなっております。

my $tmpl = HTML::Template->new(
die_on_bad_params => 0,
filename => './html/' . $page
);

# HTMLテンプレートにデータベースから読み込んだ情報を設定
$tmpl->param(
dlid => $dlid,
sid => $sid,
message => "$message"
);

#HTMLの表示
print "Content-Type: text/html\n\n";
print $tmpl->output();

この部分をいじってもダメでしょうか?
また、何か対策はないでしょうか。
よろしくお願いいたします。

A 回答 (5件)

>最初に表示されるときはlogへの書き込みがなされないのですが


>更新ボタンを押すと書き込みがされます。

ということですが、最初のアクセスではJavaScriptがスクリプトエラーや何らかの形でスクリプトを停止していて、二回目のアクセスでそのエラーが消えている可能性はないでしょうか。

たとえばreffererやcookieなどが空の場合に処理ができずにエラー(スクリプトエラーで停止、またはその時点でデータ不備として処理を停止する)になっているが、二回目のアクセスでは値が入っているために処理が続行できるような作り方ですと、
1回目でアクセスできず、2回目でアクセス可能になることがあります。


ブラウザキャッシュ、Perlプログラム、JavaScriptプログラム、HTMLのどれかに原因があるとは思いますが、ソースコード全文を見ないと推測でしか答えられません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
やっと意味がわかりました。
解決方法は4番の解答いただいた方のお礼に入れておきました。

お礼日時:2013/10/21 07:58

あ、よく見たらまたミスってた気がします。



> とするとhtmlの表示のところにご指摘の記述をするのではなく
> logを書き込む記述のところに書けばいいということでしょうか?

今ひとつlogを書き込む記述というのが何を言っているのかわかりませんが、
質問文には次のようなJavaScriptが書いてあると思います。

> <script type="text/javascript">
> document.write("<img src=http://・・・/index.cgi?page=XXXX&r=" + document.referrer + ">");
> </script>
このindex.cgiのimageを表示するところで、先の回答で書いたキャッシュを無効にするHTTPヘッダーを付けてください。

これがどの画像フォーマットの画像を表示しているか知りませんが、例えばprint "Content-Type: image/jpeg"やprint "Content-Type: image/gif"、print "Content-Type: image/png"などになっている箇所を以前の回答のように変更し、キャッシュが無効になるようにしてください。
    • good
    • 0
この回答へのお礼

やっと意味がわかりました。<img src・・・がキャッシュを読みこんでしまうので、うまくいかないということですね。
全ページをキャッシュ無効にするのはちょっと不都合だったので、以下のサイトに
いいアイデアがありました。
https://support.google.com/dfp_premium/answer/11 …

javascriptで乱数を変数に格納して、<img src="http・・・index.cgi?key=乱数?>
みたいにすると呼び出すcgiファイルが毎回異なることになるので、これでキャッシュを
呼び込まないことになります。

やったらできました。本当に助かりました。
ありがとうございました。

お礼日時:2013/10/21 07:56

すいません。


ちょっとぼやっとしてました。

print "Content-type: text/html; charset=Shift_JIS\n\n";
を次のように書き換えてください。
注意: 1行目の\nが2つから1つに減っています
print "Content-type: text/html; charset=Shift_JIS\n";
print "Pragma:no-cache\n";
print "Cache-control:no-cache\n";
print "\n";

こうすることで、HTTPヘッダーでキャッシュをしないようにブラウザーに命令できます。
CGIで出力する場合のHTTPの各行は\nで終わりますが、空行はヘッダーの終了を意味しますので。
くわしくはこれを見てください。
http://tools.ietf.org/html/rfc3875#section-6.2
    • good
    • 0
この回答へのお礼

ありがとうございます。結果は変わりませんでした。
いまログを確認したところ、そもそも最初のアクセスでログが記録できて
いませんでした。よってログを書き込む記述のところでキャッシュが
影響しているということでしょうか。

とするとhtmlの表示のところにご指摘の記述をするのではなく
logを書き込む記述のところに書けばいいということでしょうか?

お礼日時:2013/10/19 15:02

「更新ボタン」を押すと書き込みがされる(つまり、ログに残る?)ということから考えると、CGIが返すイメージがブラウザにキャッシュされていると予想します。



とりあえず、アクセス解析に使っているCGIが編集できるとしたら、
print "Content-Type: text/html\n\n";
の後に次のような記述を入れ、ページをキャシュさせないようにしてはいかがでしょうか。
print "Pragma: no-cache\n\n";
print "Cache-control: no-cache\n\n";

参考までに
http://tools.ietf.org/html/rfc2616#section-14.9
    • good
    • 0
この回答へのお礼

ありがとうございます。やってみました。

print "Content-Type: text/html\n\n";
がないので、

print "Content-type: text/html; charset=Shift_JIS\n\n";
という記述の下に書いてみました。

アクセス解析の解析結果の上に
Pragma:no-cache Cache-control:no-cache
が表示されるだけでした。

お礼日時:2013/10/19 14:20

perlはあまり関係ないと思います。



index.cgiを仮に画像のパスにした場合は初回に表示されますか?

Webブラウザは何を使用しているのでしょうか?

この回答への補足

print "Content-Type: text/html\n\n";
の記述の前にindex.cgiを実行する記述をperlで書くことはできないでしょうか?

補足日時:2013/10/19 13:10
    • good
    • 0
この回答へのお礼

ありがとうございます。
IE9.0を使っております。

画像を表示するようにするのですよね?
<script type="text/javascript">
document.write("<img src=http://・・・/xxx.jpg>");
</script>
とすると、画像が正しく表示されました。

お礼日時:2013/10/19 12:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!