web-dev-qa-db-ja.com

Cookieの値とURLに基​​づいてページをキャッシュする

私は、多言語および多国語のサイトで作業しています。これは、ユーザーが最初にサイトにアクセスしたときに設定された国別Cookieに応じて、ページに表示されるコンテンツが異なることを意味します。 cookieの値には分類のtidを使用したため、大文字と小文字の区別などの問題はありませんでした。

問題は、Drupalのcache_pageテーブルがコンテンツをURLのみで索引付けするため、国が異なるが同じURLのユーザーはすべて同じコンテンツを取得することです。 mod_rewriteの実装を変更するだけで、必要な効果を得ることができました。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{QUERY_STRING} !(cid)
RewriteCond %{HTTP_COOKIE} (?:^|;\s*)country=([^;]*)
RewriteRule ^(.*)$ $1?cid=%1&%{QUERY_STRING} [L,R=302]

RewriteCond %{QUERY_STRING} ^$
RewriteCond %{HTTP_COOKIE} (?:^|;\s*)country=([^;]*)
RewriteRule ^$ /?cid=%1 [L,R=302]

# Rewrite URLs of the form 'x' to the form 'index.php?q=x'.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

ExpiresDefaultディレクティブを無効にする必要がありました。ユーザーが国を切り替えたときに、ブラウザーが古いコンテンツを記憶していたためです。

Cache_pageテーブルの結果のcidは次のようになります。

http://example.com/pagename?cid=98
http://example.com/pagename?cid=256

この投稿は、「困ったときに助けて」というよりも、「この問題が発生したので、ここで解決しました。これを行うためのより良い方法を考えていただけますか?」

1
Johanna Ediger

.htaccessルールがなくても実行できます。

Drupalコアキャッシュ。 settings.phpファイルで変更します(Apacheのみ)。から http://drupal.org/node/361832#comment-4204294

<?php
// Check if cookie is set.
if (!empty($_COOKIE['my_cookie'])) {
  // Add cookie value to page cache id.
  $_SERVER['REQUEST_URI'] .= '#' . $_COOKIE['my_cookie'];

}
// Disable page cache if cookie not set so your magic code can set the cookie.
else {
  $conf['cache'] = CACHE_DISABLED;
}
?>

Memcache http://drupal.org/node/942914#comment-447715

1
mikeytown2