[CGIで自動更新:方法a] 日時を判別し、新旧どちらかのHTMLを返す方法
それでは、まずは、「現在ページ用のHTMLファイル」と「更新ページ用のHTMLファイル」の2ファイルを事前に用意しておき、現在時刻に応じて、前者か後者のどちらかの中身を(CGIを使って)出力する方法から解説致します。■例:
ここでは、以下のようなURLとファイル名で構成する場合を例にして説明します。
- 自動更新したいページが表示されるURL:
→ http://www.example.com/autorenew/ などのように「/」で終わるURL - 上記のURLをブラウザで閲覧した際に、実際に表示されるファイル:
→ index.cgi - 自動更新したいページの「現在の内容」を記述したHTMLファイル:
→ present.html - 自動更新したいページの「更新後の内容」を記述したHTMLファイル:
→ new.html
■準備:
まずは、下記のように「.htaccess」ファイルを用意します。「.htaccess」ファイルについて詳しくは、別途記事「.htaccessファイルの書き方と設置方法」をご参照下さい。
DirectoryIndex index.cgi index.html <Files new.html> deny from all </Files>上記の記述の意味は、以下の2つです。
(1) 自動更新したいページが表示されるURL(http://www.example.com/autorenew/)にアクセスされた際に「index.cgi」が表示されるようにする。
(2) 更新後の内容を記述した「new.html」には、直接は閲覧できないようにアクセスを制限する(※ブラウザから閲覧できなくなるだけで、後述のCGIから中身を読み出すことは可能です)。
※この準備が不要なケース:
ウェブサーバによっては、わざわざ上記のように「.htaccess」ファイルを記述しなくても、(index.htmlが存在しない場合には)代わりにindex.cgiが実行(表示)される設定になっている場合もあります。その場合で、更新後のファイル「new.html」のファイル名を、推測されにくい複雑なファイル名(「hPq6d3C.dat」など)にした場合は、ここでの準備(上記の「.htaccess」ファイルの作成)はしなくて問題ありません。
■日時を判別して、返すデータを切り替えるCGIを作成:
以下のようにPerlソースを記述し、「index.cgi」のファイル名で保存し、自動更新したいページとしてアクセスできる位置にアップロードします。
#! /usr/bin/perl use Time::Local; # ▼指定日時 my $renewDate = timelocal(45 ,59 ,23 ,31 ,12-1 ,2014 ); # ▼現在時刻を判別 my $htmlFile; if( $renewDate < time ) { # 指定時刻よりも現在時刻の方が後なら「更新」ページの中身を返す $htmlFile = 'new.html'; } else { # 指定時刻よりも現在時刻の方が前なら「現在」ページの中身を返す $htmlFile = 'present.html'; } # ▼新旧どちらかのファイルを出力 print "Content-Type: text/html\n\n"; open(IN,$htmlFile); print <IN>; close(IN);上記は、指定日時を「2014年12月31日23時59分45秒」に設定したい場合の記述例です。ここで日時の指定に使っているtimelocal関数は、引数として「秒,分,時,日,月,年」の順番で日付を指定します。このとき、5番目の引数の「月」は、「0が1月」・「1が2月」……「11が12月」をそれぞれ示すため、1を引いています。この点を間違えないようご注意下さい。
上記では、わざわざ12月のことを「12-1」のように計算式の形で記述していますが、もちろん最初から「11」と記述しても構いません。ただ、紛らわしいので書き間違えないようご注意下さい。なお、2014年9月29日13時0分0秒を指定したいなら、以下のようになります。
my $renewDate = timelocal(0 ,0 ,13 ,29 ,9-1 ,2014 );
※CGIはサーバ側で実行されるため、閲覧者の環境(パソコンなど)の時刻設定は無関係です。閲覧者の環境で「現在日時」がどのような日時に設定されていても、サーバ側の「現在日時」で判別されます。
※ブラウザで表示したときに、「500 Internal Server Error」エラーが出てしまう場合は、CGIのソースに何らかの問題があります。サーバによっては、1行目の「#! /usr/bin/perl」を「#! /usr/local/bin/perl」にしなければならない場合もあります。
以上で完成です。
■動作のイメージ:
閲覧者が、自動更新対象のURLである http://www.example.com/autorenew/ にアクセスすると、index.cgi が実行され、
- 指定時刻より前なら、present.html の内容が出力
- 指定時刻より後なら、new.html の内容が出力
この場合、URLは「http://www.example.com/autorenew/」のまま変化しません。指定時刻の前にアクセスしておき、指定時刻の後に再読込すれば、ページが更新されたように見えます。なお、本番使用の前には、意図通りに正しく実行されるかどうか、直近の日時などを使ってテストして下さい。
■制約:
ここでは、新旧2つのHTMLファイルの中身を、CGIで読み込んでから出力しています(URLを変えないようにするため)。そのため、HTMLファイル中でSSI(Server Side Include)を使っていたり、PHPなどを使ってHTMLを動的に生成している場合には、この方法は使えません。 その場合は、次の「新旧どちらかのURLへ転送する方法」を使って下さい。
それでは最後に、方法bの「CGIで日時を判別し、新旧どちらかのURLへ転送する方法」をご紹介致します。