2013-03-03 17 views
21

Node.js ExpressアプリケーションのすべてのHTTP応答からetagヘッダーを削除する必要があります。 Expressで書かれたWebサービスAPIがあり、etagsを送信してクライアントがif-none-matchヘッダーを送り返すと、クライアントで予期しない結果が表示されます。Express Node.jsのetagヘッダーを無効にする

app.disable('etag')res.removeHeader('etag')を試しましたが、いずれも機能しません。アプリはヘッダーに関係なく送信します。

すべての応答でこのヘッダーを無効にする方法はありますか?

答えて

34

app.disable('etag')が動作するようになりました、そこにはプル要求は、これに対処するために統合されました:

https://github.com/visionmedia/express/commit/610e172fcf9306bd5812bb2bae8904c23e0e8043

UPDATE:Bigoodはコメントで指摘したように物事の新しい方法は以下の通りですhttps://github.com/strongloop/express/releases/tag/3.9.0

app.set('etag', false); // turn off 

変更はバージョン3.9.0で発生しました

etagの設定に関するその他のオプションについては、こちらの4.xドキュメントを確認してください。http://expressjs.com/4x/api.html#app.set

+0

クール。正しい答えとしてマーク! – Raj

+8

特定のエンドポイントのみのetagsを無効にする方法はありますか?私は私のAPIエンドポイントでetagsをしたくないですが、私は静的コンテンツのetagsが欲しいです。 – Zambonilli

+0

3.9.0からこのように動作しません:https://github.com/strongloop/express/releases/tag/3.9.0 – Bigood

2

あなたの問題に対する本当の解決策は、なぜそれがetagsのために奇妙な挙動をしているのかを理解することです。

あなたの質問にお答えするために、Expressでは現在、etagsヘッダーを無効にするサポートはありません。それは実際に議論され、in this pull requestに統合されましたが、後で元に戻されました。これが本当に必要で根本的な問題を解決しようとしたくない場合は、いつでもそのパッチを適用してそこから行くことができます。

+1

Y!遅い場合は、etagsを削除するように指示します。 – chovy

+0

私はそれを見てもリクエストを受け取りましたが、将来的にはうまくサポートされないような変更ではなく、フレームワークによってサポートされていた標準的な方法を望んでいました。 – Raj

+1

彼らはそれを取り戻したように見える:https://github.com/visionmedia/express/pull/1694 –

2

Expressメソッドを見ると、リクエストメソッドがGETの場合のみEtagsが送信されます。 expressがresponse.send()を呼び出す前にrequest.methodを別のものに設定することで、Expressが応答内のetagsを送信しないようにすることができます。

例:これは私のために働いOK

app.get('/path/returnsJSON', function(req, res){ 
/* HACK to workaround the framework sending e-tags and "304 NOT MODIFIED" responses */ 
req.method="NONE"; // was "GET" 
res.status(200).send({data:1}); 
}); 

19
app.disable('etag') 

これにより、すべてのリクエストのetagヘッダーは無効になりますが、静的コンテンツは無効になります。静的コンテンツの場合は次のようになります。

app.use(express.static(path.join(__dirname, 'public'), { 
     etag: false 
})); 
+1

これは簡単に忘れてしまいますので、重要です – migg

+0

これは文書化されていませんが、 'res.sendFile( '...'、{etag:false})'の場合にも有効です。私の場合、 'app.disable( 'etag')'と 'app.set( 'etag'、false)'はうまくいきませんでした。 – youen

関連する問題