• 締切済み

JavaScriptのアクセス解析が動きません

当方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(); この部分をいじってもダメでしょうか? また、何か対策はないでしょうか。 よろしくお願いいたします。

みんなの回答

回答No.5

>最初に表示されるときはlogへの書き込みがなされないのですが >更新ボタンを押すと書き込みがされます。 ということですが、最初のアクセスではJavaScriptがスクリプトエラーや何らかの形でスクリプトを停止していて、二回目のアクセスでそのエラーが消えている可能性はないでしょうか。 たとえばreffererやcookieなどが空の場合に処理ができずにエラー(スクリプトエラーで停止、またはその時点でデータ不備として処理を停止する)になっているが、二回目のアクセスでは値が入っているために処理が続行できるような作り方ですと、 1回目でアクセスできず、2回目でアクセス可能になることがあります。 ブラウザキャッシュ、Perlプログラム、JavaScriptプログラム、HTMLのどれかに原因があるとは思いますが、ソースコード全文を見ないと推測でしか答えられません。

hhanz10
質問者

お礼

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

回答No.4

あ、よく見たらまたミスってた気がします。 > とすると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"などになっている箇所を以前の回答のように変更し、キャッシュが無効になるようにしてください。

hhanz10
質問者

お礼

やっと意味がわかりました。<img src・・・がキャッシュを読みこんでしまうので、うまくいかないということですね。 全ページをキャッシュ無効にするのはちょっと不都合だったので、以下のサイトに いいアイデアがありました。 https://support.google.com/dfp_premium/answer/1116933?hl=ja javascriptで乱数を変数に格納して、<img src="http・・・index.cgi?key=乱数?> みたいにすると呼び出すcgiファイルが毎回異なることになるので、これでキャッシュを 呼び込まないことになります。 やったらできました。本当に助かりました。 ありがとうございました。

回答No.3

すいません。 ちょっとぼやっとしてました。 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

hhanz10
質問者

お礼

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

回答No.2

「更新ボタン」を押すと書き込みがされる(つまり、ログに残る?)ということから考えると、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

hhanz10
質問者

お礼

ありがとうございます。やってみました。 print "Content-Type: text/html\n\n"; がないので、 print "Content-type: text/html; charset=Shift_JIS\n\n"; という記述の下に書いてみました。 アクセス解析の解析結果の上に Pragma:no-cache Cache-control:no-cache が表示されるだけでした。

  • aspl21
  • ベストアンサー率25% (25/97)
回答No.1

perlはあまり関係ないと思います。 index.cgiを仮に画像のパスにした場合は初回に表示されますか? Webブラウザは何を使用しているのでしょうか?

hhanz10
質問者

お礼

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

hhanz10
質問者

補足

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

関連するQ&A

専門家に質問してみよう