Кэширование страниц drupal и hook_init

299
27 ноября 2017, 19:57

Столкнулся с проблемой кэширования в Drupal 7. Я использую модуль Admin Security который при за ходе на страницу авторизации, запускает проверку текущего ip со списком ip который хранится в БД (белый список адресов). И если ip зашедшего на страницу авторизации отличается со списком адресов nо страница авторизации пользователю не показывается (возвращает 403). В php все просто запускается функция admin_security_init() в которой происходят все проверки. Почитав по просторам интернета понятно что хук init запускается если страница не кэширована. И правильно, запустив модуль и полный сброс кэша модуль какое-то время работает пока страница не закэшируется. Сам модуль:

function admin_security_init() {
  if (variable_get('admin_security_enabled', 0)) {
    if (_admin_security_parseurl()) {
      module_load_include('inc', 'admin_security', 'inc/admin_security_ip_check');
      $current_ip = ip_address();
      if ($current_ip != '127.0.0.1') {
        $allowed = FALSE;
        $allowed_ips = variable_get('admin_security_ips');
        if (isset($allowed_ips) && is_array($allowed_ips)) {
          $allowed = _admin_security_ip_is_allowed($current_ip, $allowed_ips);
        }
        elseif (class_exists('Database', FALSE)) {
          $allowed = _admin_security_ip_is_allowed($current_ip);
        }
        // Deny access if an allowed IP address is not available.
        if (!$allowed) {
          watchdog('admin_security', 'An admin page request from IP @ip was blocked.', array('@ip' => $current_ip));
          header($_SERVER['SERVER_PROTOCOL'] . ' 403 Forbidden');
          header('Content-Type: text/html;charset=utf-8');
          echo "<p>Access denied! Доступ закрыт!</p>
          <p>This page is available only by ip. Данная страница доступна только по ip</p>
           <p>" . check_plain(ip_address()) . " has been banned from site administration. " . check_plain(ip_address()) . " был заблокирован администратором сайта. </p> ";
          exit();
        }
      }
    }
  }
}

Что я делал:

  1. Кто-то писал, что можно попробовать отключить кэш таким методо

    function admin_security_boot(){ if( !empty( $_SESSION['cart_items'] ) ){ $GLOBALS['conf']['cache'] = false; } }

Не получилось. Через минут 10-15 модуль перестает работать

  1. Установил модуль Cache exclusions который исключает из кэширования нужные страницы. Опять не пошло.

  2. Отключал в самом в друпале admin/config/development/performance кэширование полностью.

Итог модуль какое-то время работает, потом перестает. Помогает полный сброс кэша. Можно конечно попробовать внедрить полный сброс кэша на все внутренние страницы, но это такой себе выход честно говоря. Наверное воспользуюсь им если уже ничего не поможет и никто не поможет:)

Answer 1

Не стоит утяжелять сайт таким модулем! в Drupal и прочих cms, любой модуль - это нагрузка на сервер. Все это решается проще и надежнее средствами самого сервера. Для апача пишем в .httacces

<Directory /user/login>
Order deny,allow
deny from all
# Список IP через пробел, с которых доступ разрешен
Allow from 192.168.2.2 192.168.2.3 //примеры ip

для nginx

location /user/login {    
# блокируем все    
deny    all;    
# кроме    
allow   192.168.2.5 192.168.2.5;    
}

путь /user/login - стандартный в drupal на страницу логина, точнее /?q=user - пробуйте и этот путь.

READ ALSO
Отправка сообшения на почту через localhost

Отправка сообшения на почту через localhost

Всем приветТак как я новичок в YII решил задать вопрос тут

203
Найдите ошибку в MySQL

Найдите ошибку в MySQL

Найдите ошибку в MySQL, UPDATE не происходит, но сообщение об ошибке не выводится

237