私の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
他の答え 、ページキャッシュは最初のヒットでバイパスされます。 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
配列用です。