
当方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件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
>最初に表示されるときはlogへの書き込みがなされないのですが
>更新ボタンを押すと書き込みがされます。
ということですが、最初のアクセスではJavaScriptがスクリプトエラーや何らかの形でスクリプトを停止していて、二回目のアクセスでそのエラーが消えている可能性はないでしょうか。
たとえばreffererやcookieなどが空の場合に処理ができずにエラー(スクリプトエラーで停止、またはその時点でデータ不備として処理を停止する)になっているが、二回目のアクセスでは値が入っているために処理が続行できるような作り方ですと、
1回目でアクセスできず、2回目でアクセス可能になることがあります。
ブラウザキャッシュ、Perlプログラム、JavaScriptプログラム、HTMLのどれかに原因があるとは思いますが、ソースコード全文を見ないと推測でしか答えられません。
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"などになっている箇所を以前の回答のように変更し、キャッシュが無効になるようにしてください。
やっと意味がわかりました。<img src・・・がキャッシュを読みこんでしまうので、うまくいかないということですね。
全ページをキャッシュ無効にするのはちょっと不都合だったので、以下のサイトに
いいアイデアがありました。
https://support.google.com/dfp_premium/answer/11 …
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
ありがとうございます。結果は変わりませんでした。
いまログを確認したところ、そもそも最初のアクセスでログが記録できて
いませんでした。よってログを書き込む記述のところでキャッシュが
影響しているということでしょうか。
とすると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
ありがとうございます。やってみました。
print "Content-Type: text/html\n\n";
がないので、
print "Content-type: text/html; charset=Shift_JIS\n\n";
という記述の下に書いてみました。
アクセス解析の解析結果の上に
Pragma:no-cache Cache-control:no-cache
が表示されるだけでした。
No.1
- 回答日時:
perlはあまり関係ないと思います。
index.cgiを仮に画像のパスにした場合は初回に表示されますか?
Webブラウザは何を使用しているのでしょうか?
この回答への補足
print "Content-Type: text/html\n\n";
の記述の前にindex.cgiを実行する記述をperlで書くことはできないでしょうか?
ありがとうございます。
IE9.0を使っております。
画像を表示するようにするのですよね?
<script type="text/javascript">
document.write("<img src=http://・・・/xxx.jpg>");
</script>
とすると、画像が正しく表示されました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
INDIRECT 横に再度抽出したい
-
Strawberry Perl for Windows ...
-
perlのプログラミング 部分入れ...
-
Perlでファイルの末尾から指定...
-
perl の open について教えてく...
-
Perl言語について。
-
ファイルをディレクトリ分配の...
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
Perlのエラーについてご教授く...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
bashスクリプト
-
ファイルアイコンの左下に緑の□...
-
perlプログラミング 空白行削除
-
perlでリテラル値はメモリにど...
-
perlで2次元配列をサブルーチ...
-
Perlで時間の計算
-
perlについて
-
perlのrequireの動き方について...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テキストファイルで提出とは?
-
Perlのエラーについてご教授く...
-
perlをバージョンアップしたら...
-
Perlで時間の計算
-
Wallpaper Engineでおすすめの...
-
Perl言語について。
-
perlで2次元配列をサブルーチ...
-
Strawberry Perl for Windows ...
-
#!/usr/bin/perlで書きだしたCG...
-
perl の open について教えてく...
-
INDIRECT 横に再度抽出したい
-
アルファベットに付いて質問し...
-
openした後、closeしないでプロ...
-
画像が表示でnull; this.src
-
VBA変数をFunction.VLookupの戻...
-
perlのflock関数でロックをかけ...
-
Perl の外部モジュールの利用方法
-
TeraPadエディターの操作方法に...
-
bashスクリプト
-
perlの構文でカンマの意味が分...
おすすめ情報