2012-04-27 4 views
3

は、Rack :: Deflaterが応答本体をgzipできるようにする際に奇妙なことに遭遇しました。おそらく私は何かが欠落していますが、これを有効にするとレスポンスは圧縮されますが、すべての単一リクエストでリソースのETagが変更されます。これは、アプリケーションが304を送信するのではなく、毎回応答するようにしています。これは、Rack :: Deflaterを有効にしなくても動作し、ページソースが変更されていないことを確認しました。 Webサーバーとしての薄型のレールアプリを実行していますか?Rack :: Deflaterが有効になっているときにETagが変化します

Gemfile.lock https://gist.github.com/2510816

私が起こっていただきました!見ることができるかもしれないので、私は、ラックのミドルウェアからもう少し出力を得ることができます何らかの方法はありますか?

ありがとうございます。

答えて

7

私は元の問題を修正しましたが、依然として望ましい結果を得ていません。 Rack :: Deflaterは、ミドルウェアスタックのRack :: ETagの前にある必要があります。しかし、なぜこれによってETagがすべての要求を変更するのかはわかりますが、config.middleware.use "Rack::Deflater" config.middleware.insert_before "Rack::ETag", "Rack::Deflater"に変更すると、ETagは要求全体で一貫しています。私はまだ304を取得していないが、私はそれが誤ったキャッシュ制御ヘッダーと元の問題とは無関係であると考えている。うまくいけば、これは将来誰かを助けてくれるでしょう。

+0

参考になるのは 'Rack :: ETag'です。ここでは、取得しているタグを作成しています。ミドルウェアスタックに 'Rack :: Deflater'の後ろに置くと、圧縮されたデータのハッシュを作成しようとしますが、これは間違っています。 –

+0

それは意味がありますが、たとえそれが圧縮データから生成されていても、入力データと圧縮データが変更されていなければ、サーバーが生成しているETagは変わってはいけません。 –

+0

アルゴリズムが決定論的であり、外部からのデータを追加しない限り。どちらにも当てはまらない。推測すると、圧縮にはタイムスタンプが追加されています。または、そのハッシュ関数をランダム化することもできます。 –

関連する問題