私は(3つのシナリオすべてで)同様の問題を抱えており、Symfonyの組み込みリバースプロキシキャッシュで次の戦略をうまく使用しました:
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]
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);
}
「静的」API の場合は、応答オブジェクトを取得して変更するだけです。
$response->setPublic();
$response->setSharedMaxAge(6 * 60 * 60);
セッション、ユーザー、またはセキュリティ トークンがあるため、Symfony は実質的にデフォルトで$response->setPrivate()
.
2 番目のポイントである REST 規則 (およびリバース プロキシの推奨事項) に関しては、GET および HEAD リクエストは、リクエスト間で変更することを意図していません。このため、ログインしているユーザーに基づいてコンテンツが変更される場合は、応答をプライベートに設定し、リバース プロキシ キャッシュのキャッシュをまったく防止する必要があります。
速度のためにキャッシングが必要な場合は、 reverse-proxy ではなく、内部で処理する必要があります。
各ユーザー ロールに基づく URL を導入したくなかったため、キャッシュに (誤って) 処理させるのではなく、ロールごとに応答を内部的に (Redis を使用して) キャッシュし、直接返しました。
3 番目のポイントについては、HTTP と HTTPS のトラフィックが同じキャッシュにヒットし、応答にパブリック/プライベートとキャッシュ制御の設定が明示的に設定されてAppCache
いるため、安全なトラフィックと安全でないトラフィックの両方で同じ応答が提供されます。
これが私にとって同じくらい役立つことを願っています!