Quantcast
Channel: レンタルサーバーのCPIスタッフブログ
Viewing all articles
Browse latest Browse all 131

Drupal7、PHP、静的ファイルにLastModified、ETagを追加する

$
0
0

昨今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番号でも良さそうですね。

 


Viewing all articles
Browse latest Browse all 131

Trending Articles