通常は特定のページにリダイレクトするURLがありますが、これより前にいくつかのコードが実行されます。 RedirectResponse
インスタンスを返していますが、キャッシュされているようです。これをキャッシュしないようにするにはどうすればよいですか?
RedirectReponseクラスから作成された応答はキャッシュされません。したがって、キャッシュメタデータを設定する必要はありません。ここでの問題は、おそらく匿名リクエストのページキャッシュであり、リダイレクトが可能であるかどうかに関係なく、すべての応答がキャッシュに入れられるかどうかに関係なくキャッシュされます。
このキャッシュを無効にするには、応答を返す前にkillスイッチを使用します。
\Drupal::service('page_cache_kill_switch')->trigger();
Internal Page Cacheのみが無効になります。プロキシやブラウザキャッシュなどのdrupalの外部のキャッシュを制御するには、/admin/config/development/performance
に移動して、[ページキャッシュの最大経過時間]を設定します。
上記のコメントで述べたように、RedirectResponseSubscriber
はリダイレクトを変更します。関連するスニペットは次のとおりです。
_if (!($response instanceof SecuredRedirectResponse)) {
try {
// SecuredRedirectResponse is an abstract class that requires a
// concrete implementation. Default to LocalRedirectResponse, which
// considers only redirects to within the same site as safe.
$safe_response = LocalRedirectResponse::createFromRedirectResponse($response);
$safe_response->setRequestContext($this->requestContext);
}
_
したがって、キャッシュしてはならないカスタムリダイレクトがある場合は、SecuredRedirectResponse
を拡張するカスタムクラスを作成し、必要なisSafe()
メソッドを実装します。 LocalAwareRedirectResponseTrait
を利用して、URLがローカルであることを確認し、これがリダイレクトであり、誤用ではないことを確認する他のチェックを併用することもできます。リダイレクトは上記のブロックをスキップし、キャッシュ可能なリダイレクトに変換されません。私を正しい方向に向けてくれた@ smartsheet-engに感謝します。
Cacheable RedirectResponse で応答をキャッシュしたい場合があります