xandeadx.ru Блог музицирующего веб-девелопера

Drupal → Отключить кэш страниц для определённых ip адресов

Опубликовано в

Основная сложность в том, что если аноним заходит на закэшированную страницу, то нет никакой возможности с помощью API повлиять на результат. Поэтому приходится делать проверку на самом раннем этапе бутстрапа — инициализации конфига.

Соответственно, чтобы отключить кэш страниц для определённых ip адресов, нужно в settings.php добавить:

if (in_array($_SERVER['REMOTE_ADDR'], array('1.2.3.4', '5.6.7.8', ...))) {
  $conf['cache'] = FALSE;
}
Написанное актуально для Drupal 6
Похожие записи

Комментарии RSS

До этого момента делал редирект для ie6 на javascript, т.к. не нашёл более или менее вменяемого способа обойти кэширование.
После прочтения статьи пришла идея: а что если на этапе инициализации конфига проверять браузер и редиректить, если ie6? Я в правильном направлении мыслю?

не совсем понятно что вы хотите сделать, но попробуйте

Попробую добавить конкретики :)

Дело всё в том, что когда добавляешь что-то вроде

$user_agent = $_SERVER['HTTP_USER_AGENT'];
if (stripos($user_agent, 'MSIE 6.0') !== false) {
header ("Location: /ie6.html");
}

в файл page.tpl.php, то нет никакой гарантии, что этот код не закэшируется. Я не нашёл способ отключить кэширование для этого кода, кроме использования block cache, с помощью которого можно отключить кэширование для конкретного блока и поместить в этот блок нужный нам код. Но ставить модуль для единственного редиректа не разумно, по-моему. С помощью API мне не удалось решить эту проблему тоже, быть может всё дело в плохом знакомстве с ним. Поэтому пришлось делать редирект для пользователей IE6 на javascript, но в этом случае мне жаль пользователей, которые отключают javascript в своих IE6 :)

А после прочтения данной статьи я подумал, что можно добавить проверку на IE в settings.php, ведь в таком случае мне удастся избежать кэширования.

Буду рад указанию на свои ошибки, я, по всей видимости, ещё многого не знаю )

И снова у меня идея: а не нужно ли мне поместить проверку браузера в hook_boot() ? :)

Сейчас посмотрел код модуля browscap - они собирают инфу о браузере в hook_init(), но этот хук ведь не используется для закешированных страниц! Я чего-то не понимаю, по всей видимости? Не нужно ли им использовать hook_boot?

перечитайте ещё раз пост

Вы имеете ввиду, что я увлёкся оффтопом или что «если аноним заходит на закэшированную страницу, то нет никакой возможности с помощью API повлиять на результат»?

Если первое, то да, я признаю, можете не продолжать отвечать.
Если второе, то разве «Only use this hook if your code must run even for cached page views» не подразумевает, что мы можем изменить вывод даже закешированной страницы с помощью этого хука?

хук выполнится, но вывод изменить нельзя

Да, справедливое замечание.
Ну и буду очень признателен, если поделитесь соображениями по поводу лучшего способа определить браузер анонима при включеннном кэшировании.

ну ваш код будет работать и в settings.php и в hook_boot

После подключения стороннего скрипта в Drupal 7 через behavior (требуется перезагрузка DOMпосле изменения результатов поиска в форме стиль отображения которой регулируется сторонним javascript) наблюдается переполнение кэша и зависание браузера...
Как этого избежать?

что такое переполнение кэша?

Это значит, что браузер клиента просматривающего сайт с подключенным через behavior этим сторонним javascript начинает использовать неприлично много ресурсов ЦП и памяти, что вызывает впоследствии зависание браузера клиента при многократном изменении параметров формы поиска на views.
Проблема частично решилась принудительной чисткой кэша браузера клиента посредством подключения flushCache:
Drupal.attachBehaviors().flushCache();
Но, насколько я понимаю, это неправильно... Но что именно неправильно непойму...
Сам изначальный код подключеного js:

(function ($) {
  Drupal.behaviors.tb_neris = {
    attach: function (context, settings) { 	
	$('form#views-exposed-form-used-cars-page').jqTransform({imgPath:'/images/'});	
	$('.jqTransformSelectWrapper ul li a', context).bind('click', function() {
		Drupal.attachBehaviors();		
		});			
	}
  };
})(jQuery);

не понимаю, как это связано с темой поста

Очень, даже связано, у него есть скрип, при этом АПИ он определяет при помощи ПХП, потом передает это значение во внешнюю переменную JS. И так выходит что АИП для всех пользователей один и тоже. Впорос как кеш как передать значение АПИ внешнему скрипту JS?

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании