23

状況:静的コンテンツの default_expiration を「14d」に設定して Google App Engine サイトを実行している

問題: Chrome と Safari で URL にアクセスすると (リロードせず、アドレス バーにカーソルを置いて Enter キーを押すだけ)、大量のリクエストが If-None-Match ヘッダーで起動されます。予想どおり、応答は常に 304 Not Modified です。これらのリクエストが、Charles や Fiddler などのデバッグ プロキシで起動されるのを見ることができます。

希望:静的コンテンツに対してこれらのリクエストと 304 応答を完全に回避するには、ブラウザーのキャッシュされたコンテンツが利用可能になったときにそれを信頼するだけです。

標準の「非常に長い間静的コンテンツをキャッシュし、キャッシュを無効にする必要がある場合は、クエリ文字列に ?version={version} の変更を追加する」システムを使用しているため、実際には避けたいと考えています。 304の。

信念:これは、アプリ エンジンがすべての静的コンテンツ レスポンスで送信する etag ヘッダーが原因だと思います。アプリ エンジン SDK はこのヘッダーを送信しませ。SDK をいじっても、この 304 動作は見られません。

何かアドバイス?App Engine の静的コンテンツの etag を無効にすることはできますか?

静的コンテンツの例で更新: http://www.khanacademy.org/stylesheets/shared-package/compressed.css

4

7 に答える 7

8

GAE の etags ヘッダーの動作を制御する方法はないと思いますが、これは、POST 要求の後に 302 リダイレクトを受信すると、すべての静的コンテンツが再ダウンロードされる WebKit のバグが原因です。

WebKit がこのバグを修正すると、問題は解決するはずです。

必要に応じて、302 リダイレクトを使用する代わりに Refresh ヘッダーを介してリダイレクトすることで、この特定の POST 後のリダイレクトのバグを一時的に回避できます。

https://bugs.webkit.org/show_bug.cgi?id=38690

Post/Redirect/Get での WebKit イメージのリロード

http://www.google.com/support/forum/p/Chrome/thread?tid=72bf3773f7e66d68&hl=en

于 2011-02-28T21:14:46.463 に答える
5

Last-Modified ヘッダーと ETag ヘッダーの両方を削除する必要があります。

ETag ヘッダーを削除すると、キャッシュとブラウザーがファイルを検証できなくなり、Cache-Control と Expires ヘッダーに依存することになります。エンティティ タグ (ETag) は、キャッシュされたファイルの新しいバージョンをチェックするメカニズムです。

Last-Modified ヘッダーと ETag ヘッダーの両方を削除すると、If-Modified-Since および If-None-Match 要求とそれらの 304 Not Modified 応答が完全に排除されるため、Expires ヘッダーが新しいコンテンツを示すまで、ファイルは更新をチェックせずにキャッシュされたままになります。利用可能です。

詳細はこちら: http://www.samaxes.com/2008/04/htaccess-gzip-and-cache-your-site-for-faster-loading-and-bandwidth-saving/ .

残念ながら、GAE の静的コンテンツでそれらをオフにする方法がわかりません。

于 2010-12-11T02:48:23.757 に答える
3

あなたの ETag 値は問題ありません。ETag は再検証を強制しません。最終更新日よりも信頼性が高くなるだけです。Chrome 9 を使用して静的コンテンツの例を参照したところ、コンテンツがキャッシュされ、不必要に再検証されることはありません。あなたが見た問題は、ほとんどのブラウザーのデフォルトではない「常に再検証する」ブラウザー設定に関連している可能性があります。また、Mac Webkit 関連のバグである可能性もあります。

于 2011-02-10T11:21:22.713 に答える
3

クローム 9.0、ウィンドウズ。ホームページをロードするとき、default.css と他のすべての .css ファイルは、リクエストを行わずにキャッシュから提供されます。これはブラウザ固有の動作だと思います。他のブラウザも確認する必要があります。

また、この Google の指示を確認してください。キャッシュ パラメータを調整するときに大いに役立ちました: http://code.google.com/speed/page-speed/docs/caching.html

于 2010-12-10T19:46:56.220 に答える
3

これは Chrome と Safari の問題であるため、HTML5 App Cacheを使用して、静的リソースでのサーバー呼び出しを完全に防ぐことができます。ここで例を確認してください。

于 2010-12-10T20:10:45.650 に答える
2

「Enter」キーを押したり更新したりせずに、リンクをたどるだけで同じことが起こるかどうかを確認してください。その場合、ブラウザは別のことをします。特にSafariは、更新を使用しない場合、またはページを再度明示的に要求しない場合にのみ、要求が実行されるはずの方法で要求を実行します。

Macでこれを非常に簡単に試すことができます。あるポートでnetcat(nc)を使用して単純なサーバーを実行します。たとえば、9090としましょう。

nc -l 9090

http:// localhost:9090へのリンクを含む単純なページを作成してクリックし、ncコマンドが表示するヘッダーを確認します。

ncに入力して、手動で応答を返します。たとえば、次のようになります。

HTTP/1.0 200 OK
ETag: "xyz"
Content-type: text/plain

Some text.

リンクをもう一度クリックすると、リクエストのIf-None-Matchヘッダーが表示されます。アドレスバーのアドレスの後に戻ると、Safariがヘッダーを送信しないことがわかります。

于 2010-12-10T21:38:55.533 に答える
-1

appengine-web.xml 構成でこの機能をリクエストするために、新しいイシューを投稿しました。

ぜひチェックして投票してください!

https://code.google.com/p/googleappengine/issues/detail?id=10339&sort=-id&colspec=ID%20Type%20Component%20Status%20Stars%20Summary%20Language%20Priority%20Owner%20Log

于 2013-11-28T04:03:07.220 に答える