web-dev-qa-db-ja.com

セッション変数とページキャッシュ

私のdrupalサイトは通常のキャッシュシステムを使用しています。おそらくご存知でしょうが、cache_pageテーブルはREQUEST_URIを主キーとして使用して更新されます。匿名ユーザーがページをリクエストすると、drupalがページをcache_pageからクライアントに提供するので、これはすばらしいことです。最も良い部分は、GETリクエストのすべての変数がそのページを提供するためのキャッシュIDの一部であることです。

たとえば、これらのURLがある場合

  • http://domain.com/gallery
  • http://domain.com/gallery?list_mode=thumbs

Cache_pageテーブルでは、両方のURLが異なります。

ここで問題が発生します。匿名ユーザーに「list_mode」として選択された最後のオプションを覚えてもらいたいので、次に来るとき、デフォルトで1つまたは別のリストモードを取得します。そこで、list_modeをSESSION変数として追加しました。問題は、

http://domain.com/gallery

匿名として、ページはデフォルトのlist_modeでキャッシュから提供されます。 (その値は「親指」ではありません)

このURLのcache_pageの使用を停止したくありません(これは可能な解決策でした)。理想的には、このSESSION変数をREQUEST_URIに追加して、ページが適切に提供されるようにします。この場合、翻訳の:

http://domain.com/gallery TO http://domain.com/gallery?list_mode=thumbs

キャッシュをチェックする前に、ユーザーは最初のURLではなく2番目のURLを取得します。

hook_bootはそれを行うのに適した場所ですが、request_uriをハッキングすることは良い考えではないと思います。ですから、このアプローチを行う他の方法はありますか?

ご協力いただきありがとうございます。

PS:私は同様の問題を見つけました、ユーザーはRewriteCondを使用して彼が望むものを達成し、より良い解決策を求めますが、唯一の答えはそのページのキャッシュを無効にすることをアドバイスします: Cookie値に基づいてページをキャッシュするおよびURL

2
savioret

他の答え 、ページキャッシュは最初のヒットでバイパスされます。 Cookieが設定されるため、後続のヒットはページキャッシュにヒットします。

質問に答えるには、gallery_list_modeというcookieを設定するクライアント側のJavaScriptを用意してください。何も選択されていない場合は、0に設定するか削除してください。ユーザーがthumbsを選択した場合、JavaScriptでgallery_list_mode Cookieをthumbsに設定します。次に、settings.phpの中にこれをドロップします

<?php
// Check if cookie is set and user is on a gallery page.
if (!empty($_COOKIE['gallery_list_mode']) && $_SERVER['REQUEST_URI'] == '/gallery') {
  $ok_list = array(
    'thumbs',
  );
  if (in_array($_COOKIE['gallery_list_mode', $ok_list)) {
    // Add cookie value to page cache id.
    $_SERVER['REQUEST_URI'] .= '?list_mode=' . $_COOKIE['gallery_list_mode'];

    // This line might be needed.
    //$_GET['q'] .= '?list_mode=' . $_COOKIE['gallery_list_mode'];
  }
}
?>

http://domain.com/galleryhttp://domain.com/gallery?list_mode=thumbs のキャッシュエントリを指すようになります。gallery_list_modecookieが親指に設定します。

セキュリティ機能として、必要なgallery_list_modeの値のみを受け入れるようにしてください。それが$ok_list配列用です。

1
mikeytown2