6

私は Symfony2 で古典的なステートレスな RESTfull API を作成しています: ユーザー/アプリは認証 API で認証トークンを取得し、それを他のすべての API に渡してログに記録し、データを投稿したり、他の API の保護された/プライベート/個人データにアクセスしたりします。

このワークフローとキャッシュに関して、次の 3 つの懸念事項があります。

  • 私の「静的」API (ログに記録されたユーザーとそのトークンに関係なく、常に同じコンテンツを配信する) に HTTP キャッシュを使用する方法同じになることはありませんか?では、HTTP 共有キャッシュを使用するにはどうすればよいでしょうか。

  • ログに記録されたユーザーの権利に関して、異なる出力を生成する同じ URL の API があります (基本的に 4 つの異なる権利レベルがあります)。質問: 良いパターンですか? キャッシュできるように、権利ごとに 1 つずつ、4 つの異なる URL を用意するのはよくありませんか? そうでない場合、その上に適切なキャッシュを実装する方法は?

  • 共有 HTTP キャッシュは HTTPS で動作していますか? そうでない場合、どのタイプのキャッシングを実装する必要がありますか?

ご回答いただきありがとうございます。

4

1 に答える 1

8

私は(3つのシナリオすべてで)同様の問題を抱えており、Symfonyの組み込みリバースプロキシキャッシュで次の戦略をうまく使用しました:

  1. Apache を使用している場合は、更新.htaccessしてアプリケーションの環境変数を http キャッシュのオフに追加します (注: 環境は自動的にREDIRECT_環境変数に追加されます)。

    # Add `REDIRECT_CACHE` if API subdomain
    RewriteCond %{HTTP_HOST} ^api\.
    RewriteRule .* - [E=CACHE:1]
    
    # Add `REDIRECT_CACHE` if API subfolder
    RewriteRule ^api(.*)$ - [E=CACHE:1]
    
  2. app.phpインスタンス化後にこれを追加しますAppKernel

    // If environment instructs us to use cache, enable it
    if (getenv('CACHE') || getenv('REDIRECT_CACHE')) {
        require_once __DIR__.'/../app/AppCache.php';
    
        $kernel = new AppCache($kernel);
    }
    
  3. 「静的」API の場合は、応答オブジェクトを取得して変更するだけです。

    $response->setPublic();
    $response->setSharedMaxAge(6 * 60 * 60);
    

    セッション、ユーザー、またはセキュリティ トークンがあるため、Symfony は実質的にデフォルトで$response->setPrivate().

2 番目のポイントである REST 規則 (およびリバース プロキシの推奨事項) に関しては、GET および HEAD リクエストは、リクエスト間で変更することを意図していません。このため、ログインしているユーザーに基づいてコンテンツが変更される場合は、応答をプライベートに設定し、リバース プロキシ キャッシュのキャッシュをまったく防止する必要があります。

速度のためにキャッシングが必要な場合は、 reverse-proxy ではなく、内部で処理する必要があります

各ユーザー ロールに基づく URL を導入したくなかったため、キャッシュに (誤って) 処理させるのではなく、ロールごとに応答を内部的に (Redis を使用して) キャッシュし、直接返しました。

3 番目のポイントについては、HTTP と HTTPS のトラフィックが同じキャッシュにヒットし、応答にパブリック/プライベートとキャッシュ制御の設定が明示的に設定されてAppCacheいるため、安全なトラフィックと安全でないトラフィックの両方で同じ応答が提供されます。

これが私にとって同じくらい役立つことを願っています!

于 2012-08-23T04:05:08.213 に答える