動的だけど静的なページ

できないって言われたけどできちゃったyoシリーズ第二弾!!

SEO業者さんがそんなことはできないと言っていたけど.....できちゃいました。

 5年前、SEO業者が営業に来た時のはなしです。
当時のSEO対策として動的ページより静的ページの方がインデックスされやすいといった話がありまして、動的ページを静的ページとして吐き出すツール(以後HTMLジェネレーターと呼称)を販売に来ていました。がHTMLジェネレーターだと、リアルタイムに更新が必要な動的ページでは困ったことになってしまいます。そこで、HTMLジェネレーターではなく、あくまで、動的ページを静的ページとして見せるようなツールはないかと聞いたところ、そんなことは不可能ですとご回答を頂きました。

でも、はたしてそうでしょうか?
 動的ページと静的ページの違い...。それはHTTPヘッダにあります。静的ページのHTTPヘッダを覗くとIf-Modified-Since というヘッダで、ファイルの最終更新日時が送信されてきます。ブラウザ側でこのヘッダがついていた場合、送られてきた更新日時でキャッシュを保存し、次回アクセス時にキャッシュが存在する場合、そのキャッシュの最終更新日時をLast-Modifiedヘッダで送信します。そして、サーバ側はその送られてきたLast-Modifiedヘッダを見てローカルの最終更新日時の方が新しければ、コンテンツを送信、変わっていなければHTTPステータス 304 Not Modifiedを送ってコンテンツは変わってないので、コンテンツは送らないよとメッセージを送り、ブラウザはローカルのキャッシュを使います。

 つまり、めんどくさいけど、上記仕組みをサーバ側プログラムで実装すれば実現自体は可能な筈です。で、、、phpでつくってみました。具体的には『Last-Modified』ヘッダの生成出力、『If-Modified-Since』ヘッダの受信、パース、比較のプログラムを書きます。それぞれ以下のサイトが参考になります。

なのですが、CGI版のPHP*1の場合は、apache_request_headers()関数が使えませんので、$_SERVER['HTTP_IF_MODIFIED_SINCE']で取って来れない場合には以下のようにmod_rewriteを使ってヘッダを取ってこれるようにする必要があります。この場合$_ENV['HTTP_IF_MODIFIED_SINCE']のような感じでアクセスします。

RewriteEngine On
RewriteBase /

RewriteCond %{HTTP:If-Modified-Since} .+
RewriteRule .* - [E=HTTP_IF_MODIFIED_SINCE:%{HTTP:If-Modified-Since}]
RewriteCond %{HTTP:If-None-Match} .+
RewriteRule .* - [E=HTTP_IF_NONE_MATCH:%{HTTP:If-None-Match}]

今となってはSEO的には全く意味ないです。はい。
ただ、転送量の削減という意味では役に立つけどねー。