1

以前にこの質問をしたことがあり、私の問題は実際には存在しないと誤解していました (「キャッシングと HTTPS 」を参照)。私は間違っていた; 問題は存在します。

私の問題の説明は次のとおりです。

  1. HTTP ページからリソース (たとえば、resource-a ) をロードすると (HTTP ページではすべてのリソースが HTTP から取得されます) 200 OK、. ページをリロードする (または別の HTTP ページに移動する) と、resource-a が304 Not Modified.
  2. HTTPS ページから resource-a を読み込むと (HTTPS ページではすべてのリソースが HTTPS から読み込まれます)、resource-a は HTTPS から読み込まれ、200 OK. そして、ページをリロードする (または別の HTTPS ページに移動する) と、304 Not Modified.
  3. HTTP ページに戻ると、resource-a はまだ304 Not Modified.
  4. HTTPS ページに戻ると、resource-a が200 OK. キャッシュされたコピーはどうなりましたか? キャッシュするにはどうすればよいですか?

ヘッダーの例を次に示します。

Request URL: https://styles.mydomain.com/assets/styles/main.css
Request Method: GET
Status Code: 200 OK

Request Headers
Accept: text/css,*/*;q=0.1
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Connection: keep-alive
Host: styles.mydomain.com
Referer: https://www.mydomain.com/sign-in/
User-Agent: Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4

Response Header
Accept-Ranges: bytes
Cache-Control: public
Connection: Keep-Alive
Content-Encoding: gzip
Content-Length: 11836
Content-Type: text/css
Date: Tue, 02 Oct 2012 09:51:20 GMT
Expires: Fri, 30 Sep 2022 09:51:20 GMT
Keep-Alive: timeout=5, max=99
Last-Modified: Tue, 02 Oct 2012 09:25:30 GMT
Server: Apache/2.2.22 (Unix) mod_ssl/2.2.22 OpenSSL/0.9.7a mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635 PHP/5.3.8
Vary: Accept-Encoding
4

4 に答える 4

6

これは最良の推測にすぎませんが、HTTP 接続を介してリソースをキャッシュする (または保護されていないセッションのキャッシュからロードする) と、「信頼されていない」とマークされ、したがって、 HTTPS 接続のキャッシュからロードされます。

HTTPS の目的の 1 つは、リソースが転送中の盗聴から保護されるだけでなく、仲介者によって変更されないようにすることです。次のシナリオを検討してください。

[HTTP] GET /foo.js (client -> middleman -> server)
Server replies "blue"
Middleman mutates "blue" into "green"
Client caches "green"

この時点でfoo.js、キャッシュからロードすると、汚染されたコピーがfoo.jsHTTPS セッションにロードされ、ページ ビュー全体のセキュリティが損なわれます。HTTPS セッションはファイルの信頼性を検証できないため (安全な接続を介してキャッシュされていないため)、ファイルを安全に再生し、侵害されたリソースが読み込まれないようにファイルの新しいコピーを読み込むことを選択します。

あなたの状況は、ファイルの安全にキャッシュされたコピーを持っているという点でやや興味深いものですが、安全でないページのキャッシュからそれを返しています。私の推測では、これがファイルを汚染しているため、安全なキャッシュに再利用できない可能性があります。これはどのブラウザで使用していますか?

編集:そして考え; SSL を使用できるので、リソースの SSL バージョンを常にロードするとどうなるでしょうか? 私の推測が正しければ、これによりキャッシュが汚染されるのを防ぎ、リソースがキャッシュされたままになるはずです。

于 2012-10-05T17:19:16.580 に答える
0

申し訳ありませんが、If-Modified-Since-requestheaderが表示されません。正しければ(wiki)、サーバーが.で応答できるようにするためにこのヘッダーが必要です304 Not Modified

したがって、問題は、クライアントが正しいリクエストを送信していないことです。おそらく、クライアントはhttpsリクエストにhttpからキャッシュされたコンテンツを使用していません。では、httpsモードで更新して、2番目のhttpsリクエストでリクエストされているかどうかを確認しましたか?

于 2012-10-12T12:55:44.797 に答える
0

使用している.htaccessファイルはありますか?はいの場合は、キャッシュ用に以下のコードを .htaccess ファイルに配置してください。

ExpiresActive On
ExpiresByType text/css "access plus 60 days"

これがあなたを助けることを願っています...

于 2012-10-11T13:55:36.733 に答える