RSS配信の一部をIf-Modified-Sinceに対応 HEADリクエストは使われないのが標準的

Anonymous氏よりHEADリクエストを使用しているRSSリーダーは皆無 (BlogId:37)へ以下のコメントを頂きました。

HEADよりも If-Modified-Since で GET してくるクライアントの方が多いよ。こっちの方がリクエスト一回で304か202か判断できるので効率的な気がする。

恥ずかしいことに、webmasterはIf-Modfied-SinceはHEADリクエストでのみ送られてくるものだと勘違いしていました。If-Modified-Sinceヘッダを送ってくれるUAを収集したところ、沢山のクライアントが対応している様子でした。リクエスト数1位のRSSバーは対応していない様子ですが、2位のgoo RSSリーダーは対応していました。

早速、Googleニュース関連のRSSのPHPスクリプトを修正してIf-Modfied-Sinceヘッダを送ってくれるクライアントに対して、更新が無いときはHTTP/1.1 304 Not Modifiedを返すようにしました。数日間、転送量を監視してみようと思います。

尚、If-Modified-Sinceヘッダの値の解釈にはモジュール版PHPで「If-Modified-Since」に対応するに掲載されている関数を利用させて頂きました。Etagについても参考にさせていただきました。

関数を利用する際に、動作確認を行ったところ最初はうまくいきませんでした。調べてみたところ、Content-lengthを返していた場合のIf-Mdofied-Sinceの値に対応していないようでした。たとえばSat, 18 Dec 2004 13:44:54 GMT; length=2153といった値です。「;」以降があるためにうまく解釈できない様子でしたので、正規表現を使用して「;」以降を削除するようにして対応しました。以下がサンプルコードです。

$headers['If-Modified-Since'] = preg_replace("!;.+$!is", "", $headers['If-Modified-Since']);

順次、アクセスの多いRSSも対応していきたいと思います。

コメント / トラックバック

コメントは受け付けていません。