10

GoogleAppEngineでアプリケーションのバックエンドシステムを開発しています。

私のアプリケーションとバックエンドサーバーはjsonと通信しています。http://server.example.com/api/check_status/3838373.jsonのように、またはhttp://server.example.com/api/check_status/3838373/のみ

そして、JSONページのキャッシュにCloudFlareを使用することを計画しています。

ヘッダーにどちらを使用する必要がありますか?:

Content-type: application/json
Content-type: text/html

CloudFlareは、コストを削減するためにサーバーの応答をキャッシュしますか?CSSや画像などは使わないので。

4

4 に答える 4

23

標準のCloudflareキャッシュレベル(ドメインのパフォーマンス設定の下)は標準/アグレッシブに設定されています。つまり、デフォルトのスクリプト、スタイルシート、画像では特定のタイプのみがキャッシュされます。アグレッシブキャッシングは、通常のWebページ(つまり、ディレクトリの場所または* .html)をキャッシュせず、JSONをキャッシュしません。これはすべてURLパターンに基づいており(たとえば、.jpgで終わるのですか?)、Content-Typeヘッダーに関係ありません。

グローバル設定は、それほど積極的にすることはできず、それ以上にすることはできません。そのため、カスタムキャッシュルールとして[すべてキャッシュ]を使用して、これらのURLに一致する1つ以上のページルールを設定する必要があります。

http://blog.cloudflare.com/introducing-pagerules-advanced-caching

ところで、JSON応答にHTMLContent-Typeを使用することはお勧めしません。

于 2012-07-19T23:26:54.747 に答える
9

デフォルトでは、CloudflareはJSONファイルをキャッシュしません。私は新しいページルールを設定することになりました:

https:/domain.com/sub-directiory/*.json*

  • キャッシュレベル:すべてをキャッシュする
  • ブラウザキャッシュTTL:タイムアウトを設定します
  • エッジキャッシュTTL:タイムアウトを設定します

jsonのCloudflareページルール

それが誰かの日を救うことを願っています。

于 2020-09-11T10:44:00.203 に答える
5

新しいワーカー機能(5ドル追加)はこれを容易にすることができます:

重要なポイント: Cloudflareは通常、通常の静的ファイルをほとんど期限切れにならないものとして扱います(または、おそらく1か月でした-私は正確に忘れています)。

だから最初は思うかもしれません"I just want to add .json to the list of static extensions"。これは、JSONで必要とされない可能性があります(実際にめったに変更されない限り)、またはファイル名でバージョン管理されます。ファイルを更新するとその時間内に更新されますが、サーバーがすべてのエンドユーザーからの個別の要求に襲われないように、おそらく60秒または5分のようなものが必要です。

.jsonすべての拡張ファイルをインターセプトするためにワーカーを使用してこれを行った方法は次のとおりです。

// Note: there could be tiny cut and paste bugs in here - please fix if you find!
addEventListener('fetch', event => {
  event.respondWith(handleRequest(event));
});

async function handleRequest(event)
{
  let request = event.request;
  let ttl = undefined;
  let cache = caches.default;      
  let url = new URL(event.request.url);

  let shouldCache = false;


  // cache JSON files with custom max age
  if (url.pathname.endsWith('.json'))
  {
    shouldCache = true;
    ttl = 60;
  }

  // look in cache for existing item
  let response = await cache.match(request);

  if (!response) 
  {       
    // fetch URL
    response = await fetch(request);

    // if the resource should be cached then put it in cache using the cache key
    if (shouldCache)
    {
      // clone response to be able to edit headers
      response = new Response(response.body, response);

      if (ttl) 
      {
        // https://developers.cloudflare.com/workers/recipes/vcl-conversion/controlling-the-cache/
        response.headers.append('Cache-Control', 'max-age=' + ttl);
      }

      // put into cache (need to clone again)
      event.waitUntil(cache.put(request, response.clone()));
    }

    return response;
  }

  else {
    return response;
  }
}

拡張機能の代わりにmime-typeを使用してこれを行うこともできますが、API応答を過剰にキャッシュしてしまう可能性があるため、非常に危険です。

また、ファイル名でバージョン管理している場合-例:products-1.json/products-2.jsonその後、有効期限のヘッダーを設定する必要はありませんmax-age

于 2019-05-10T00:06:45.307 に答える
1

Cache-Controlヘッダーを設定することで、他のページをキャッシュするのと同じように、CloudflareにJSON応答をキャッシュできます。s-maxageしたがって、JSONをエッジ( )とブラウザ( )で60秒間キャッシュする場合max-ageは、応答に次のヘッダーを設定するだけです。

Cache-Control: max-age=60, s-maxage=60

さまざまなキャッシュ制御ヘッダーオプションの詳細については、次を参照してください。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control

Cloudflareプランが異なれば、許可される最小エッジキャッシュTTLの値も異なることに注意してください(エンタープライズプランでは1秒まで許可されます)。ヘッダーの値がそれよりも小さい場合は、無視される可能性があります。ここで制限を確認できます。

https://support.cloudflare.com/hc/en-us/articles/218411427-What-does-edge-cache-expire-TTL-mean-#summary-of-page-rules-settings

于 2021-03-31T13:25:52.190 に答える