Back to Question Center
0

CloudFlareがSemaltの場合は変更されていない場合は送信しない

1 answers:

私は適切なコンテンツのために304 Not Modified</code>のレスポンスを提供することによってサーバー負荷を軽減しようとしています. CloudFlareは私の中間者ですから、キャッシュされたページが期限切れになったときに、<code>If-Modified-Since</code>ヘッダーを送信する必要があります。 </p><p>私はこれらの回答を受けています、クライアント側:</p><ul><li><code>CF-Cache-Status:MISS</code>の最初のページのロード</li><li><code>CF-Cache-Status:ページリロード時に20秒間ヒットします</li><li><code>CF-Cache-Status:20秒後にページをリロードしたときにEXPIRED</code></li></ul><p>期限切れの要求は私のサーバーに転送されますが、<code>If-Modified-Since</code>ヘッダーは含まれません. これをどのように機能させることができますか? </p><pre><code><?php $ now = time<div class="post-text" itemprop="text">; ヘッダー( "ETag:W / \" $ now \ ""); ヘッダー( 'Expires:'. gmdate( 'D、d M Y H:i:s \ G \ M \ T'、$ now + 20));ヘッダー( 'Last-Modified:'. 時間<div class="post-text" itemprop="text">); ヘッダー( 'Cache-Control:public、max-age = 20');print( '<pre>'); print_r($ _ SERVER); print( '</pre>');</code></pre><p>更新:セマール作業コード</p><pre><code><?phpif(isset($ _ SERVER ['HTTP_IF_MODIFIED_SINCE'])){// $ date = $ _SERVER ['HTTP_IF_MODIFIED_SINCE'];ヘッダ( "HTTP / 1. 1 304 Not Modified ");出口<div class="post-text" itemprop="text">; }$ format = 'D、d M Y H:i:s \ G \ M \ T'; $ now = time<div class="post-text" itemprop="text">;$ date = gmdate($ format、$ now); ヘッダー( 'Date:'. $ date); ヘッダー( 'Last-Modified:'. $ date);$ date = gmdate($ format、$ now + 30); ヘッダー( 'Expires:'. $ date);ヘッダー( 'Cache-Control:public、max-age = 30');print( '<pre>'); print_r($ _ SERVER); print( '</pre>');</code></pre></div></div></div></div></div>

February 5, 2018

私の理解と経験から、おそらくあなたはCDNのキャッシュがどのように動作するか誤解しているように思えます:

  • あなたが与えた例から、CDNは、ファイルが最後に変更されたときにあなたのWebサーバーに尋ねることはありませんでした。なぜなら、ファイルが期限切れであったため、再度フェッチする必要があるとにかく

しかし、CDNは通常、Webブラウザと同じように動作しません。プロキシサーバーやWebアクセラレータに似ています。

  • CDNキャッシュページが期限切れになった場合、次にWebブラウザから要求されたときに、CDNはWebサーバーから新しいコピーをフェッチし、CDNキャッシュされたコピーを更新し、リソースをHTTPレスポンスのWebブラウザ. 私のテストでCloudFlareはまだこのヘッダーを発行していることが判明しましたが、If-Modified-SinceヘッダーがWebサーバーにまったく届かないという要件は通常ありません.

  • サーバーの負荷を軽減するには、CDNが、s-maxageディレクティブを使用して、Webブラウザですでに行われているレベルを超えるレベルのキャッシングを提供できるようにします.

    ヘッダー( 'Cache-Control:public、max-age = 20、s-maxage = 60');

    このヘッダーを使用すると、Webブラウザからの最初の要求はCDNMISSになりますが、WebブラウザとCDNの両方にキャッシュされます. 最初の20秒後に、Webブラウザのキャッシュされたコピーは期限切れになります. ページがリロードされると、CDNはCDNキャッシュからHTTPレスポンスでWebブラウザにコピーを返すためにさらに40秒間HITします. 最初のリクエストから60秒後、CDNキャッシュは期限切れとなり、その後のリクエストはCDN期限切れになりますが、CDNMISSと同様に扱われます。 -serverとなるので、ループシーケンスは続行されます.

    1時間のWebブラウザキャッシングと6時間のCDNキャッシングのための、プロダクション対応のヘッダーが次のようになります。

    ヘッダー( 'Cache-Control:public、max-age = 3600、s-maxage = 21600');

    CDNの有効期限が6時間を超えるアップデートを公開する必要がある場合は、Webベースのコントロールパネルから最新のキャッシュを取るようCDNに指示することができます. このヘッダーでは、各リソースはWebサーバーから1日に4回フェッチされますが、CDNはすべての大量のWebトラフィックを処理します.


2014年11月11日@ 12:45 pm UTC-0で編集:

影響があるかもしれない副作用では、正しい操作に影響を与えるかもしれないPHPコードに問題があります - あなたのETagおよびExpiresヘッダ行のコード私がそれらをテストすると、次のヘッダーが生成されます。

ETag:W /
Expires:Thu、1970年1月1日00:00:20 GMT

おそらく代わりにあなたの送信ヘッダを見ることができるように、あなたのテストでこれらの行を試してみてください:

<?php
$ iClientCacheSecs = 20;
$ iProxyCacheSecs = 60;
$ dtNow = time

; $ dtExpires = strtotime(sprintf( '+%s秒、$ iClientCacheSecs)); $ aHeaders = array

; $ aHeaders [] = 'ETag:'. $ dtNow; $ aHeaders [] = '期限切れ:' 日付( 'r'、$ dtNow). '
'); foreach($ aHeadersを$ sHeaderとして)echo($ sHeader. '
'); echo( '


'); foreach($ _SERVERを$ sParam => $ sValue){if((strpos($ sParam、 'HTTP_CF'))!== false)echo($ sParam '
');if((strpos($ sParam、 'HTTP_IF'))!== false)echo($ sParam. ':'. $ s値.

304 Not Modifiedヘッダーには依然としてサーバーへのリクエストが必要であることに注意してください.

304 Not Modifiedヘッダーを送信したくない場合、キャッシュの有効期限ヘッダーを送信するのが最も好きなので、ブラウザはリソースを再度要求しようとしません. ).

私の経験では、CloudFlareは静的リソース用のLast-Modifiedヘッダーのみを送信します.

あなたCloudFlareのページのURLを見て、あなたのページを与えることがあります(私は. e. 画像、スクリプトなどではありません.

CloudFlareがSemaltの場合は変更されていない場合は送信しない
Reply