web-dev-qa-db-ja.com

expressjsでのetagの仕組み

Expressjsは自動的にetagを送信します。 etagの生成方法を知りたいのですが、getルーチンによって動的に生成されるコンテンツに基づいています。または、コンテンツ(DBからの動的コンテンツ)を生成し、同じようにetagを返すプロセスさえ経ることなく、それを維持する方法がありますか?.

有効なセッションIDであるかどうかを確認するだけで始まり、クライアントが提供するのと同じetagを返すミドルウェアであるか、URL +セッションIDに基づいている場合があります。そして、db呼び出し全体とそれらすべてのものを通過するのではなく、そこで要求を終了します。この場合、クライアントが304呼び出しを行っていることを知る必要があります。

Expiresタグを使用できますが、セッションが終了したら。誰かがURLを開いている場合、許可されません。そのため、etagもセッションIDに基づいている必要があると考えています。この動的コンテンツシナリオでは、変更された場合にどのように機能しますか。使用できますか。

39
coool

執筆時点(2014年7月8日)では、弱いETagは CRC32source )を使用して生成され、強いETagはMD5( source )。

Expressへの貢献者の1人の意見に基づいて 、次の方法で、強いETagを使用するか弱いETagを使用するかを指定できます。

_app.enable('etag') // use strong etags
app.set('etag', 'strong') // same
app.set('etag', 'weak') // weak etags
_

次のように独自のカスタム関数を指定してETagを実行することもできます。

_app.set('etag', function(body, encoding){ /* return valid etag */ });
_

NPMパッケージ fresh も、新鮮さのチェックのためにExpressで使用されているため( source1source2 )、見る価値があります。

アプリケーションに関しては、応答ヘッダーをオーバーライドできることに注意してください。 res.set('etag', 'my-awesome-etag-value')(または同様の関数)を呼び出す前のres.send()さらなる議論(長所と短所を含む)はここにあります: https://github.com/visionmedia/express/issues/2129#issue-34053148

41
stellarchariot