Закрыть сайт WordPress через удаленные данные - PullRequest
0 голосов
/ 13 июля 2010

У меня есть веб-сайт, управляемый WordPress, и я должен иметь возможность закрыть сайт в любой момент.Мне нужна помощь, чтобы выработать способ сделать так, чтобы скрипт php проверял удаленный файл (xml, php и т. Д.), Размещенный на другом сервере, для проверки переменной (т. Е. Website = closed).Если переменная присутствует, закройте сайт с сообщением типа «Сайт временно закрыт».Кто-нибудь есть какие-либо советы о том, как это сделать, или знает о любых ресурсах, к которым я могу получить доступ.

Знание WordPress = хорошо / Знание PHP = новичок

Спасибо: -)

Ответы [ 2 ]

1 голос
/ 15 июля 2010

ОК, мне было скучно, поэтому я потратил некоторое время на это сегодня:)

Очевидно, в WP есть встроенная функция, позволяющая сайту переходить в режим обслуживания. Все, что нужно, - это файл в корне установки WP, и ему должно быть присвоено имя .maintenance - таким же образом .htaccess файлы получают имена с начальным периодом (это обозначает файл как скрытый), и нет расширение.

Итак, создайте файл .maintenace в корне вашей установки WP (должен быть на том же уровне, что и wp-config.php, wp-login.php и т. Д.). В этом файле добавьте следующее:

<?php $upgrading = time(); ?>

сообщает WP, что сайт находится в режиме обслуживания. ПРИМЕЧАНИЕ: с этим файлом в каталоге, как есть, сайт будет недоступен.

Вы можете изменить внешний вид сообщения о режиме обслуживания и даже установить таймер, чтобы сайт возвращался через определенное время. См. здесь для получения дополнительной информации.

С этим на месте, проверьте сайт, чтобы убедиться, что режим обслуживания включен. Если это так, переименуйте .maintenance в .maintenance_off. Это будет наше состояние по умолчанию для этого файла; он будет находиться там с именем .maintenance_off, позволяя сайту нормально функционировать, пока вы не захотите включить режим обслуживания, когда он будет переименован в .maintenance.

Я уже устал писать режим обслуживания, поэтому с этого момента я буду называть режим обслуживания m-m, хорошо?

Итак, теперь о сценариях;

При каждой установке WP, которую вы хотите включить и выключить, вам понадобятся 2 вещи:

  • файл .maintenance_off, описанный выше;
  • PHP-скрипт для переименования:

создайте файл с именем remote_maint.php в корне вашей установки WP, на том же уровне, что и ваш .maintenance_off файл. В него добавить следующее:

<?php

$p=$_GET;

/*
this is just some basic auth; not safe, not secure, but better than nothing. 
Change the key to something more complicated. Though, because we're using GET,
even if it's really complicated, it's still not secure. You should really improve
this if you don't want random people putting your WP installs into maintenance mode...
*/
$key='test';

//if mode==on, use turn_on() function otherwise use turn_off() function
($p['mode']=='on')?turn_on($p):turn_off($p);

function turn_on($p){
    //if the key in the request matches our key here, rename the file, otherwise set page header as unauthorized
    ($p['key']==$key)?rename('.maintenance_off','.maintenance'):header("HTTP/1.0 401 Unauthorized");
}

function turn_off($p){
    //if the key in the request matches our key here, rename the file, otherwise set page header as unauthorized
    ($p['key']==$key)?rename('.maintenance','.maintenance_off'):header("HTTP/1.0 401 Unauthorized");
}

?> 

ОК, как говорится в комментариях, «безопасность» небезопасна. Вы должны улучшить его ... Если это утешит вас, если кто-то получит ключ, который вы решите использовать, худшее, что он может сделать, это поместить ваш сайт в m-m.

Этот скрипт выполняет проверку запроса на странице, например:

http://site.com/remote_maint.php?mode=on&key=test

этот запрос сообщит сценарию, что режим on, а ключ test. Первая троичная операция увидит режим on и вызовет функцию turn_on(), отправив вместе с ней массив $_GET, который был присвоен переменной $p. Функция turn_on() затем проверяет ключ, отправленный в запросе ($p['key']), против ключа, установленного в верхней части скрипта ($key); если он совпадает, он переименует .maintenance_off в .maintenance, фактически включив m-m. Если ключ не соответствует запросу, он устанавливает заголовок страницы на 401 Unauthorized, см. Ниже.


С этим все на месте, время для центрального командования; код, который будет делать вызов. В своем тестировании я использовал jQuery , чтобы можно было включать и выключать m-m на нескольких сайтах с одной страницы без перезагрузки.

На другом сайте или там, где вы хотите администрировать mm, создайте страницу с именем remote_maint_admin.php (на самом деле это не обязательно должен быть .php, может быть .html или любой другой) и добавьте следующее:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>Remote Maintenance</title>
<script src="js/jquery.js"></script>
</head>
<body>
<div id='main'>
    <fieldset>
        <legend>site 1</legend>
        <div id='site-1' style='border:0px solid #000'>
            Auth key:
            <input type="text" id='key-1' size="30"/>
            <input type="button" value="Turn on" onClick="change_mode('on','http://site.com/','1');" />
            <input type="button" value="Turn off" onClick="change_mode('off','http://site.com/','1');" />
        </div>
        <br>
        <div id='status-1' style='border:1px solid #ccc;color:#666'>Status</div>
    </fieldset>
</div>
    <script>
    function change_mode(mode,url,id){
        var key = $('#key-'+id).attr('value');
        var url=url+'remote_maint.php?mode='+mode+'&key='+key;
        $.ajax({
            url:url,
            type: 'GET',
            complete: function(){
                $('#status-'+id).html('<b>Request Completed');
            },
        });
    }
    </script>       
</body>

измените http://site.com/ на ваш URL. Чтобы добавить больше сайтов, скопируйте основной div и повторите его:

<div id='main'>
    <fieldset>
        <legend>site 2</legend>
        <div id='site-2' style='border:0px solid #000'>
            Auth key:
            <input type="text" id='key-2' size="30"/>
            <input type="button" value="Turn on" onClick="change_mode('on','http://site2.com/','2');" />
            <input type="button" value="Turn off" onClick="change_mode('off','http://site2.com/','2');" />
        </div>
        <br>
        <div id='status-2' style='border:1px solid #ccc;color:#666'>Status</div>
    </fieldset>
</div>

вот еще один счастливый маленький div здесь, чтобы управлять другим сайтом

<div id='main'>
    <fieldset>
        <legend>site 3</legend>
        <div id='site-3' style='border:0px solid #000'>
            Auth key:
            <input type="text" id='key-3' size="30"/>
            <input type="button" value="Turn on" onClick="change_mode('on','http://site3.com/','3');" />
            <input type="button" value="Turn off" onClick="change_mode('off','http://myothersite.com/','3');" />
        </div>
        <br>
        <div id='status-3' style='border:1px solid #ccc;color:#666'>Status</div>
    </fieldset>
</div>

... и измените номер идентификатора ввода (например, id='key-1' на id='key-2' и номер идентификатора состояния (например, id='status-1' до id='status-2' и вызов javascript (например, onClick="change_mode('on','http://site.com/','1');" до onClick="change_mode('on','http://myothersite.com/','3');" соответственно для каждого сайт, который вы хотите добавить ...

Теперь, когда вы вводите свой ключ в текстовое поле и нажимаете «Включить» или «Выключить», js возьмет ваш ключ и режим (в зависимости от того, какую кнопку вы нажали) и отправит его на другой сервер.Если клавиша совпадает, mm будет включен или выключен, а div под кнопками обновится и сообщит, что запрос выполнен.Если клавиша не совпадает, Div под кнопками все равно скажет, что запрос выполнен, хотя мм не изменится.Я думал, что смогу обновить div статуса с помощью возвращенного кода состояния страницы, поэтому я установил заголовок на 401, если он потерпел неудачу, но из-за одной и той же политики происхождения коды состояния межсайтовых запросов всегда возвращаются как 0,Однако, если вы используете такой инструмент, как Firebug, вы можете посмотреть консоль, чтобы увидеть, действительно ли запрос не выполнен ...

HTH

0 голосов
/ 13 июля 2010

Вы можете установить режим обслуживания плагин , затем в этом коде найти триггер для включения режима обслуживания, а затем ввести функцию (например, curl), которая проверяет переменную на другом сайте. Например, если вы решите использовать плагин, упомянутый выше, в строке maintenance-mode.php строка 46 проверяет, включен ли режим обслуживания:

if (substr($this->g_opt['mamo_activate'], 0, 2)=='on'){... 

Вы можете добавить функцию к maintenance-mode.php, которая проверяет вашу переменную:

function check_for_external_var(){
    $crl = curl_init();
    curl_setopt($crl, CURLOPT_URL, "example.com");// set url
    curl_setopt($crl, CURLOPT_RETURNTRANSFER, 1);//return page as string
    return curl_exec($crl);//return string
    curl_close($crl);//close curl connection
}

затем, предполагая, что ваш внешний сайт возвращает on для включенного режима обслуживания и off для выключенного режима обслуживания, вы можете добавить к оператору maintenance-mode.php if примерно так:

if (substr($this->g_opt['mamo_activate'], 0, 2)=='on' || check_for_external_var()=='on'){...

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


EDIT:

На самом деле вышесказанное не сработает так, как вы думаете (я думаю).

Единственная причина, по которой я могу придумать, чтобы отключить ваш сайт, - это то, что вы можете отключить несколько сайтов одновременно. Это близко?

Если это так, было бы более разумно иметь на внешнем сайте скрипт, который выполняет GET для ваших установок WP, переводя их в режим обслуживания. Чтобы сделать это изнутри сайта, на котором выполняется установка WP, вам нужно будет запустить скрипт, который проверяет внешний сайт каждые 1028 * секунд. Это создаст много накладных расходов и может быть ненадежным.

Лучшим решением было бы иметь на внешнем сайте скрипт, который при обращении к файлу установки установит URL, который запустит режим обслуживания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...