ExpressJSでのfavicon.ico変更方法

年明け一発目の記事がこんな内容なのも不本意ですがw

Expressjsを使ったプロジェクトは、初期表示ではExpressjsの味気ないfaviconになっています。これを変更する方法です。
expressコマンドで生成したものファイルには以下の記述があります。

app.configure(function(){
   app.use(express.favicon());
});

しかし、調べた感じだと、これって無くても大丈夫そうなんです。
と同時に積極的に使う方法もあります。

変更する方法は、View側に

<link rel="shortcut icon" href="/images/favicon.ico" />

などと記述して、'/public/images/'に入れてしまう方法です。

もう一つがfavicon()の引数にパスを渡す方法です。

app.use(express.favicon(path.join(__dirname, 'public/favicon.ico')));

※引数を渡さないと、/node_modules/express/node_modules/connect/lib/public/favicon.icoになります

また、オプションとしてキャッシュコントロールとしてmaxAgeを渡す事もできます。デフォルトは1日(以下の記述と同義)です。

app.use(express.favicon(path.join(__dirname, 'public/favicon.ico'), {maxAge: 86400*10000}));

ついでですが、HTTPレスポンスヘッダにはEtagが自動で入ってしまいます。

HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: image/x-icon
Content-Length: 1406
ETag: "33e3ea7fc9c08d2e72730482906a676c"
Cache-Control: public, max-age=86400
Date: Mon, 07 Jan 2013 04:56:27 GMT
Connection: keep-alive

これを消すには、
/node_modules/express/node_modules/connect/lib/middleware/favicon.js
の68行目あたりを修正する必要があります。

           icon = {
             headers: {
                 'Content-Type': 'image/x-icon'
               , 'Content-Length': buf.length
               //, 'ETag': '"' + utils.md5(buf) + '"'
               , 'Cache-Control': 'public, max-age=' + (maxAge / 1000)
             },
             body: buf
           };

まぁ、実際の運用の場合、faviconapacheに任せてしまうとか、CDNに任せてしまった方が楽だとは思いますが。