PHP « Как правильно сделать функцию закрытия сайта?

Здравствуйте, друзья!

Иногда необходимо закрыть сайт на некоторое время. Прикидываю такой алгоритм:

1. При любом HTTP запросе прежде всего проверяю состояние сайта: "закрыт сайт? true:false".
2. Если сайт закрыт, оповещаю пользователя об этом или показываю сайт,но с ограниченным функционалом.
3. Если сайт открыт, запускается модуль обработки запроса и выдача результатов.

Было желание реализовать эту функцию при помощи mod_rewrite. Но так, как хостер иногда "любит" выключать обработку .htaccess я передумал.

Regards

1 ответов


Все зависит от задачи. К примеру CMS PHP-Fusion при закрытии сайта проверяет параметр в БД и выдает пользователю страницу заглушку, но с возможностью залогинится и проверяя права доступа решает пускать или нет. Во фреймворке Yii определяется на уровне конфигурации системы и если соответствующий параметр объявлен, то выдает предопределенную страницу, которую вы делаете по своим потребностям. Будь то просто заглушка или подобие фьюженовской реализации, а быть может и просто редирект на другой сайт. Все зависит от вас, но у всех практически одна реализация.

PHP-Fusion


if ($settings['maintenance'] == "1" && !iADMIN) fallback(BASEDIR."maintenance.php");
 
fallback это простая обертка над header

function fallback($location) {
  header("Location: ".$location);
  exit;
}
 

Yii - задаем правило в конфиге

return array(    
    // Maintenance mode
    // Default controller is OfflineController.php
    'catchAllRequest'=>array('offline'),
 и дальше обрабатывается запрос

/**
   * Processes the current request.
   * It first resolves the request into controller and action,
   * and then creates the controller to perform the action.
   */

  public function processRequest()
  {
    if(is_array($this->catchAllRequest) && isset($this->catchAllRequest[0]))
    {
      $route=$this->catchAllRequest[0];
      foreach(array_splice($this->catchAllRequest,1) as $name=>$value)
        $_GET[$name]=$value;
    }
    else
      $route=$this->getUrlManager()->parseUrl($this->getRequest());
    $this->runController($route);
  }
 
т.е. в отличие от первого варианта тут не редиректит на заданную страничку, а обрабатывается лишь заданный контроллер

на примере DLE
в init.php


if ($config['site_offline'] == "yes") include_once ENGINE_DIR . '/modules/offline.php';
 
в modules/offline.php

$tpl->load_template('offline.tpl');

  $tpl->set('{THEME}', $config['http_home_url'].'templates/'.$config['skin']);

  $config['offline_reason'] = str_replace('"', '"', $config['offline_reason']);

  $tpl->set('{reason}', $config['offline_reason']);

  $tpl->compile('main');

  echo $tpl->result['main'];

  die ();

 

Я бы в конфиге nginx прописал правило для переадресации на статичную страницу с сообщением о работах на сайте.

И самый простой вариант был бы - убирать комментарии с этого блока, который стоит выше всех и выполняется раньше всех.

Когда сайт в работе - блок комментировать и делать релоад nginx.

PS А если по уму, то при показе блока, смотрел бы на переменные окружения, которые устанавливал бы из консоли. Например деплой скриптом


Лично я сделал так:
В ISP запретил доступ в сайту, он просто просит ввести логин и пароль.

Ну, а если ввёл пароль/логин неправильно, или нажал отмену, то выдаёт примерно следущее:


Authorization Required

This server could not verify that you are authorized to access the document requested. Either you supplied the wrong credentials (e.g., bad password), or your browser doesn't understand how to supply the credentials required.
 

Увы, не разобрался, как правильно загрузить скрин. так, что незнаю, заргузится или нет. Если проблема актуальна, могу помочь в icq или скайп бесплатно

Просто в header пропиши:


            <?PHP
                if (
                    ($site_close)
                ) die("Доступ закрыт!");
            ?>
 

Соответственно, заранее определи переменную $site_close.