詳しい情報は→The WAY等
TOK2では、CGIによるHTTPヘッダーの出力は『全て』無視されます。
(◆◆◆popupサーバー/有料サーバーを除く◆◆◆)
そしてContent-Typeに無関係に、ある一つの決まったヘッダー
Connection: close Date: Sun, 11 Feb 2001 10:48:31 GMT (←現在の時刻) Server: Apache/1.3.12 (Unix) mod_layout/2.8.2 PHP/3.0.14-i18n-ja ModLayout: 2.8.2 Last-Modified: Sat, 10 Feb 2001 00:24:16 GMT (← .cgiファイルの最終更新時刻) Cache-Control: no-cache Content-Type: text/html |
よって、様々な問題が生じてきます。
代表的な症状としては、
クッキー用のMETAタグの書式は以下のとおりです。
<META HTTP-EQUIV='Set-Cookie' CONTENT='NAME=値; expires=値; domain=値; path=値; secure'>
これをCGIの吐き出すHTML文書の<HEAD>タグの直後に出力するように追加すればよいわけです。
改造方法は次のようなものです。
◆◆改造は各々の責任に於いて行ってください◆◆
※クッキーは無くても動作に支障ありません。自分の技量では下記の改造が難しいと感じた場合は、改造を行わないことをお薦めします。
$dmy_tok2_cookie = ''; # クッキー用の変数の初期化
perlでは、変数の初期化は省略可能な為、この文自体が無くてもおそらく正常に動作します。どこにいれてよいかわからない時は入れなくてもいいでしょう。(意味が分からない場合は入れない方がかえって問題が無いかもしれません)
「#」はコメントを示す記号で、#以降行末まではコメントです。
そのクッキーセット用サブルーチンのおそらく最後の方の行に
print "Set-Cookie: *******************\n";
といった行があると思いますので、この行の次に、
$dmy_tok2_cookie .= "<META HTTP-EQUIV='Set-Cookie' CONTENT='*******************'>\n";
の一行を追加挿入します。(*******************はそのまま。表示上折り返されて2行にみえる場合もありますが、必ず一行で)
「.=」は、左辺の文字列に右辺の文字列を追加する命令です。$dmy_tok2_cookie の初期値は空の文字列ですので、変数 $dmy_tok2_cookie には、クッキー用のMETAタグの内容が格納されます。
文字列が、長くなる場合は、文字列の追加演算子「.」を使って複数行に分けて書くことも可能です(改造例を参照)
print $dmy_tok2_cookie; # クッキーの発効
□□□□□□ 改造例 □□□□□□
#! /usr/bin/perl
#
require './jcode.pl';
$| = 1;
$dmy_tok2_cookie = ''; # クッキー用の変数の初期化
&init;
|
sub setcookie{ #くっきーをブラウザにプレゼントします。
local($dmy,$mdc,$monc,$yrc,$wdayc,$mc,$yc);
(〜中略〜)
$data = 'yuiend' if($FORM{'cook'} ne 'ok');
print "Set-Cookie: yuidata=$data; expires=$yc, $mdc-$mc-$yrc 00:00:00 GMT\n";
$dmy_tok2_cookie .= "<META HTTP-EQUIV='Set-Cookie' "
."CONTENT='yuidata=$data; expires=$yc, $mdc-$mc-$yrc 00:00:00 GMT'>\n";
}#このクッキーはだいたい3ヶ月間有効です。
|
print "Content-type: text/html; charset=Shift_JIS\n\n";
print "<html><head>";
print $dmy_tok2_cookie; # 追加:クッキーの発効
print "<title>";
|
print "Content-type: text/html;charset=Shift_JIS\n\n"; print <<"_HTML_"; <HTML><HEAD><TITLE>$title</TITLE>$metacode $dmy_tok2_cookie <!-- 追加:クッキーの発効 --> <SCRIPT LANGUAGE="JavaScript"> (〜中略〜) </SCRIPT></HEAD> $body _HTML_ |
print "Content-type: text/html; charset=Shift_JIS\n\n";
print $dmy_tok2_cookie; # 追加:クッキーの発効
|
<META HTTP-EQUIV='Refresh' CONTENT='秒数;URL=http://〜〜'>
これをLocationヘッダーの代わりに使用すればよいわけです。
改造方法は次のようなものです。
◆◆改造は各々の責任に於いて行ってください◆◆
print "Location: *****************\n\n";
を下記の様に変更します。
print "Content-type: text/html\n\n";
print "<html><head>";
print "<META HTTP-EQUIV='Refresh' CONTENT='0; URL=*****************'>\n";
print "</head></html>\n";
引用符が囲っているのは「0; URL=*****************」全体なので十分注意してください。
print "Content-type: text/html\n\n";
print "<html><head>";
print "<META HTTP-EQUIV='Refresh' CONTENT='0; URL=*****************'>\n";
print $dmy_tok2_cookie; # クッキーの発効
print "</head></html>\n";
□□□□□□ 改造例 □□□□□□
&writelog; #print "Location: $endpage\n\n";行頭に「#」を付けて行全体をコメントアウト print "Content-type: text/html\n\n"; print "<html><head>"; print "<META HTTP-EQUIV='Refresh' CONTENT='0; URL=$endpage'>\n"; print "</head></html>\n"; &ended; |
トクトクでは、このLastModifiedヘッダーにスクリプトの生成日時が送信されます。
そのため、キャッシュが半永久的に効いてしまい、画面の更新が出来ないという不具合が生じてしまいます。
厳密には、最終更新日時を与えるLast-Modifiedヘッダーの代替は不可能です。
しかし、Last-Modifiedヘッダー無視によるこのキャッシュの不具合を対症的に解決することは可能です。
改造方法は次のようなものです。
◆◆改造は各々の責任に於いて行ってください◆◆
utime time(), time(), __FILE__; # スクリプト生成日時の更新
utimeは、ファイルの時刻を設定するコマンドです。引数は順に 最終アクセス時刻, 最終更新時刻, 設定するファイル名 となります。__FILE__は、perlの特殊な変数で、現在のスクリプトファイル名を与えます。つまり、「このファイルの最終更新時刻を今の時間に設定しなさい」と言う命令です。
挿入の位置は実行されるところならばどこでもいいですが、通常は2行目でよいでしょう。(掲示板などの場合は書き込みが行われた時だけ実行されるようにすればより良いかもしれません。)
これにより、CGIをアクセスしたブラウザには、必ず前回のアクセスより新しい最終更新日時が送られ、キャッシュを無効化することができます。
□□□□□□ 改造例 □□□□□□
#!/usr/bin/perl
utime time(), time(), __FILE__; # スクリプト生成日時の更新
require "jcode.pl";
|
但し、画像ファイルに関してはContent-Type: text/html で送られてもブラウザが認識してくれる場合もあるようです。
トクトクから配布されているカウンターはこの曖昧さを利用して動作します。
|
|||
|
|