昨今web制作の現場でCDN(Content Delivery Network)の導入や、サイト内をクローリングし、オリジナルのサイト検索機能を付けることが多くなてきました。
これらのプロダクトを導入するときに欠かせないのが、HTTP HeaderのLast Modified(更新日時)と、ETagです。
今回の記事では動的サイトにおいてLast Modifiedと、ETagを付与する方法と、確認方法のご紹介です。
Last Modified と ETagとは
Last Modifiedは、ページの更新日時で、Etagはページのバージョン番号のようなものです。
どちらもwebのコンテンツをブラウズが読み込みに行ったときに、更新があったのかどうかを判断し、自身のブラウザキャッシュを使うかどうかを判断します。
さらにLast Modified、Etagは、CDNや、サイト内クローラーなどからのアクセスのときに、更新日時を渡したり、無駄なクローリングを避けたりと、様々なアプリケーションでも利用されます。
例えばサイト内検索エンジンを構築した場合に、サイト内をクローラーが該当ページのインデックスを作成します。
このときにLast Modifiedが無いと、クローラーはそのwebコンテンツが、いつ更新したかが分かりません。
この状態で検索インデックスを使用すると、検索結果画面の更新日時を検索エンジン経由から取得し表示することができないなどの弊害もでてきます。
Last Modified 、ETagが入っているか確認
HTTPヘッダー情報の確認方法は様々ですが、Google Chromeブラウザの拡張機能の「DHC REST Client」を使うと簡単に確認することができます。
DHC REST Client使い方
Chromeブラウザに追加した、DHS REST Clientを起動し、REQUEST欄に、取得したいHTTP Header情報のURLを入れ「Send」ボタンをクリックするだけです。
静的ファイル
では、まず静的ファイルについて確認してみます。
DHC REST Clientを起動し、URLに下記URLを入力し「Send」をクッリクします。
例)URL:shared-blog.kddi-web.com/sandbox/bootstrap/index.html
Last-Modifiedに日付が入ってヘッダー情報が送られてきました。
静的ページ(pdf、txt、htmlなど)の場合はwebサーバーが自動でLast-Modifiedを指定してくれます。
動的ページ(PHP)の場合
それではここからが本番でもあります、動的ページについてです。
まずは簡単なページをphpで作成します。
- index.php
<?php header("Content-type: text/html;"); ?><!DOCTYPE html> <html lang="ja"> <head> <title>Modifiedのテスト</title> </head> <body> <h1>Modifiedのテストです</h1> </body> </html>
こちらのファイルのヘッダー情報を確認すると、Last Modifiedを取得することができませんでした。
そこで下記のようにヘッダー情報を付与します。
<?php // 現在の日付を取得、ファイルのタイム filemtime($filename)でも可 $timestamp = time(); $last_modified = gmdate('D, d M Y H:i:s ', $timestamp) . 'GMT'; $etag = $timestamp; header("Content-type: text/html;"); header("Last-Modified: $last_modified"); header("ETag: \"{$etag}\""); ?><!DOCTYPE html> <html lang="ja"> <head> <title>Modifiedのテスト</title> </head> <body> <h1>Modifiedのテストです</h1> </body> </html>
今度はLast Modifiedを確認することができました。
現在の時刻を取得しているtime()は、そのページの更新日時を指定するか、filemtime($filename)関数で、フィアルの更新日時を指定ください。
動的ページ(Drupal7)の場合
Drupalで作成されたページについてもLast Modified、ETagは入っておりません。
追加するにはDrupalのモージュルを作成し対応します。
今回作成するモジュール名「hoge」
まず、「/sites/all/modules/custom/hoge」ディレクトリを作成し、下記ファイルを作成します。
- hoge.info
name = hoge description = Add HTTP Header Modified package = public-action version = "7.0" core = 7.x files[] = hoge.module project = "drupal" datestamp = "1269192313"
- hoge.module
<?php /** * Implements hook_preprocess_html() */ function hoge_preprocess_html(&$variables) { // ページがnodeだったら if(arg(0) == 'node'){ // 更新日付が取得できたら if(isset($variables['page']['content']['system_main'] ['nodes'][arg(1)]['body']['#object']->changed)){ $changed_unix_time = $variables['page']['content']['system_main'] ['nodes'][arg(1)]['body']['#object']->changed; // drupal_add_http_header() 関数を使い、Header情報を付与 drupal_add_http_header('Last-Modified', date( 'D, d M Y H:i:s \G\M\T' , $changed_unix_time) ); drupal_add_http_header('ETag', $changed_unix_time.'-0'); } } }
Drupalの場合、記事単体の更新日付をLast Modifiedに設定し、ETagは、更新日付のUNIXタイムに「-0」を足しています。
この「-0」はNode番号でも良さそうですね。