CGIの動作がおかしいです

★HTTPヘッダー無視の影響かもしれません

HTTPヘッダーとは、ドキュメント本体に先がけサーバーから送信される情報です。ドキュメントのタイプ(文書か画像か)/最終更新日/クッキー等の情報が含まれます。通常のファイルの場合はサーバーが自動的にヘッダーを附加しますが、CGIの場合は自力で出力する必要があります。ドキュメント本体とは二つの改行(\n\n)で区切られます。

詳しい情報は→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
が出力されます。
 そして、出力の内容(Content-Type)には無関係に、"<BODY>""</BODY>"と言う文字列の付近に広告のバナーの為の文字列が附加されます。

よって、様々な問題が生じてきます。

代表的な症状としては、

 【 Locationの不具合: Location ヘッダー無視の影響 】 

 【 キャッシュの不具合: Last-Modified ヘッダー無視の影響 】 

 【 Cookieの不具合: Set-Cookie ヘッダー無視の影響 】 

 【 ContentType指定の不具合: Content-Type ヘッダー無視の影響 】 
などがあります。


このページではこれらの問題について、改造方法も含めて解説します。
◆◆改造にはperlの知識が必要です。perlの知識のない方は改造は行わないでください。◆◆

■ クッキーが使えません/Cookieヘッダーの代替方法は?

★METAタグを使います

 METAタグとは、HTML文書のヘッダー部分(<HEAD></HEAD>の間)に記述してHTTPヘッダーを補完するタグです。

クッキー用のMETAタグの書式は以下のとおりです。

<META HTTP-EQUIV='Set-Cookie' CONTENT='NAME=値; expires=値; domain=値; path=値; secure'>

これをCGIの吐き出すHTML文書の<HEAD>タグの直後に出力するように追加すればよいわけです。

改造方法は次のようなものです。
◆◆改造は各々の責任に於いて行ってください◆◆
※クッキーは無くても動作に支障ありません。自分の技量では下記の改造が難しいと感じた場合は、改造を行わないことをお薦めします。

  1. まず、プログラム先頭部分(多くの変数をセットしている箇所があるはずです。無ければ2行目以降の適当な場所)で、変数の初期化をします。

    $dmy_tok2_cookie = ''; # クッキー用の変数の初期化

     perlでは、変数の初期化は省略可能な為、この文自体が無くてもおそらく正常に動作します。どこにいれてよいかわからない時は入れなくてもいいでしょう。(意味が分からない場合は入れない方がかえって問題が無いかもしれません)
     「#」はコメントを示す記号で、#以降行末まではコメントです。

  2. それから、cookieをセットしている場所を探します。
    恐らくサブルーチン化されていると思います。(set_cookie とか cookie_set など。もちろん、サブルーチン化されていない場合もあり得ます)エディター上で"Set-Cookie"で検索をかけるとよいでしょう。

    そのクッキーセット用サブルーチンのおそらく最後の方の行に
    print "Set-Cookie: *******************\n";
    といった行があると思いますので、この行の次に、

    $dmy_tok2_cookie .= "<META HTTP-EQUIV='Set-Cookie' CONTENT='*******************'>\n";

    の一行を追加挿入します。(*******************はそのまま。表示上折り返されて2行にみえる場合もありますが、必ず一行で)

    「.=」は、左辺の文字列に右辺の文字列を追加する命令です。$dmy_tok2_cookie の初期値は空の文字列ですので、変数 $dmy_tok2_cookie には、クッキー用のMETAタグの内容が格納されます。
     文字列が、長くなる場合は、文字列の追加演算子「.」を使って複数行に分けて書くことも可能です(改造例を参照)

  3. 次に、入力(書き込み)処理後「一番最初」に表示されるページを出力している部分を探します。エディター上で「Content-Type」や「head」で検索をかけるとよいでしょう。
    そして、<head>を出力している文のすぐ後に以下のような記述を追加します。(<head></head>に囲まれた中であれば、大丈夫です。)
    ※エラー画面や、初期パスワード入力画面等、クッキーが発効されないタイミングで表示されるページの部分は改造しても無駄です。

    print $dmy_tok2_cookie; # クッキーの発効

  4. CGIを実行し、実際に表示されるページのソースをみて、クッキーのタグが存在することを確認しましょう。

  5. 以上です。

□□□□□□ 改造例 □□□□□□


■ ページが表示されません/Locationヘッダーの代替方法は?

★METAタグを使います

ページ再描画用のMETAタグの書式は以下のとおりです。

<META HTTP-EQUIV='Refresh' CONTENT='秒数;URL=http://〜〜'>

これをLocationヘッダーの代わりに使用すればよいわけです。

改造方法は次のようなものです。
◆◆改造は各々の責任に於いて行ってください◆◆

  1. locationヘッダー出力部分を変更します。
    locationヘッダーを書き出している部分を見つけ出し、("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=*****************」全体なので十分注意してください。

  2. もし、クッキーの出力がある場合は、
     この場合は、書き込み処理後「一番最初」に表示されるのはこのリロード用ダミーページになるわけですから、クッキーの出力もここで行う必要があります。
    その場合は以下のようになるでしょう。(クッキーの項参照)

    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";

  3. 以上です。

□□□□□□ 改造例 □□□□□□


■ キャッシュが変?/Last-Modifiedヘッダーの代替方法は?

★対症療法があります

Last-Modifiedヘッダーはドキュメントの最終更新日時を送信して、キャッシュの制御などに利用されます。

トクトクでは、このLastModifiedヘッダーにスクリプトの生成日時が送信されます。
そのため、キャッシュが半永久的に効いてしまい、画面の更新が出来ないという不具合が生じてしまいます。

厳密には、最終更新日時を与えるLast-Modifiedヘッダーの代替は不可能です。
しかし、Last-Modifiedヘッダー無視によるこのキャッシュの不具合を対症的に解決することは可能です。

改造方法は次のようなものです。
◆◆改造は各々の責任に於いて行ってください◆◆

  1. CGIスクリプトの必ず実行される部分に次のの一行を追加します。

    utime time(), time(), __FILE__; # スクリプト生成日時の更新

     utimeは、ファイルの時刻を設定するコマンドです。引数は順に 最終アクセス時刻, 最終更新時刻, 設定するファイル名 となります。__FILE__は、perlの特殊な変数で、現在のスクリプトファイル名を与えます。つまり、「このファイルの最終更新時刻を今の時間に設定しなさい」と言う命令です。
     挿入の位置は実行されるところならばどこでもいいですが、通常は2行目でよいでしょう。(掲示板などの場合は書き込みが行われた時だけ実行されるようにすればより良いかもしれません。)

  2. 以上です

これにより、CGIをアクセスしたブラウザには、必ず前回のアクセスより新しい最終更新日時が送られ、キャッシュを無効化することができます。

□□□□□□ 改造例 □□□□□□


■ テキスト以外を出力するCGIは?

★作成不可能です

Content-Typeヘッダーが無視され、すべて、text/htmlで送信されるため、HTML以外を出力するCGIは正常に動作しません。つまりトクトクではHTML以外を出力するCGIは使えません。

但し、画像ファイルに関してはContent-Type: text/html で送られてもブラウザが認識してくれる場合もあるようです。
トクトクから配布されているカウンターはこの曖昧さを利用して動作します。


■ もっと簡単にCGIの問題を解決する方法はありませんか?

★便利なperlモジュールがあります

Tok2cgi.pmの説明を見てください


戻る
あなたの悩み解決します あなたの悩み解決します 給料前でお金がない・・
[PR] | RMT会社案内 作成se 転職中国SEO対策消費者金融SEO車 買取テンプレート沖縄旅行免許合宿二輪引越し税理士ゴルフ会員権留学レーシックマッサージFX投資信託くりっく365アフィリエイトFXホームページ制作デイトレードハワイ旅行タイバンコクハワイ レンタカーベスト ハワイ ホテル レーツバリ島Hawaii hotelsHawaii Activitiesbhhrハワイホテルテキスト広告
【運営会社「パラダイムシフト」サービス】 ハワイ現地オプショナルツアーリラックマ) - ビジネスクラス航空券 - 格安航空券(1) - 格安航空券(2) - 海外ホテル - 韓国旅行 - タイムシェア - ホテル 予約
無料ホームページ - 携帯ホームページ - 無料ホームページ作成 - レンタルサーバー - ブログ - ヴィラ - ハワイ コンドミニアム - バリ島 ホテル - プーケット ホテル - 旅行 口コミ - 旅行情報 - 国際電話 - ホノルルマラソン