ホームページ作成/Webサイトのユーザビリティ

指定日時にページを自動更新する方法(cron編・CGI編)(4ページ目)

指定日・指定時刻になったときに、自動でウェブページの内容を更新する方法を解説。(1)ウェブサーバのcron機能を使って、指定日時に「既存ページ」のHTMLファイルを「更新ページ」のHTMLファイルで上書きする方法と、(2)CGIを使って、現在日時に応じて新旧どちらかのページデータを返すよう切り替える方法などをご紹介。

西村 文宏

執筆者:西村 文宏

ホームページ作成ガイド

[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へ転送する方法」をご紹介致します。
  • 前のページへ
  • 1
  • 3
  • 4
  • 5
  • 次のページへ

あわせて読みたい

あなたにオススメ

    表示について

    カテゴリー一覧

    All Aboutサービス・メディア

    All About公式SNS
    日々の生活や仕事を楽しむための情報を毎日お届けします。
    公式SNS一覧
    © All About, Inc. All rights reserved. 掲載の記事・写真・イラストなど、すべてのコンテンツの無断複写・転載・公衆送信等を禁じます