読者です 読者をやめる 読者になる 読者になる

PHPで実現するRuby on Rails風味なAsset Pipelineフィンガープリンティング

5年ぶりのblogです。
以前のものは黒歴史を感じてプライベートモードにしましたw

さて、わたくし、PHP暦15年になるのですが、ここにきてPHPフレームワークに不満を感じる機会が多くなり、今年は初めてRuby on Railsに触れてみました。一人我流でWEBサービスを1個リリースした程度なので、本来のRailsを理解しているとは言い難いですが、そんな私から一つエントリーを。

Ruby on RailsのAsset Pipelineは最強ですが、その中の機能の一つにフィンガープリンティングがあります。

<link rel="stylesheet" href="/assets/style-f88b32d7f32262a8bb900c0df155644c351fa0bc5954a7f6235f40d252dc0e5d.css" />

こんな感じでファイル名に文字列を付加して、リクエストURIを変えることによりブラウザキャッシュ対策をする機能ですが、PHPフレームワークだと未だに、≪style.css?random≫なんて対応がされていて、萎えている人も多いのではないでしょうか。
ランダムパラメータ付加はブラウザによっては同一URIとみなされ、キャッシュ対策として機能しません。

やっぱRailsだよなー。所詮PHPerだもんなーなんて刹那に思ってしまったものの、よくよく考えてみるとアプリケーションサーバ型でないPHPで、これ実現するのって無理じゃね?って気付きました。愛しのPHPたんゴメンなさい!

PHPで実現する方法は以下。WEBサーバもいじる必要があります。

Apachehttpd.conf

AliasMatch ^/assets/css/(.*)(-version-[0-9]*).css$ /path/to/app/htdocs/assets/css/$1.css

PHP

function assets($file)
{
    $version = filemtime(DOCROOT.preg_replace('/^\//', '', $file));
    $retval = preg_replace('/(\.css|\.js)$/', '-version-'.$version.'$1', $file);
    return $retval;
}

<link rel="stylesheet" href="<?=assets('/assets/css/style.css')?>" />

これで以下の様にフィンガープリントが出来上がり!

<link rel="stylesheet" href="/assets/css/style-version-1472640446.css" />

ツッコミ等は@uratchまで~