我有一个WordPress驱动的网站,我需要能够立即关闭该网站。我需要一些帮助来找到一种方法来做到这一点,PHP脚本将检查托管在另一台服务器上的远程文件(xml,php,无论如何)来检查变量(即.site = closed)。如果存在变量,则使用诸如“网站暂时关闭”之类的消息关闭该站点。有没有人知道如何去做这件事,或者知道我可以访问的任何资源。
WordPress知识=好/ PHP知识=初学者
谢谢: - )
答案 0 :(得分:1)
好的,我很无聊所以今天我花了一些时间在这上面:)
显然,WP内部有一个内置功能,允许站点进入维护模式。所有需要的是WP安装的根目录中的文件,并且需要将其命名为.maintenance
- 就像.htaccess
文件以前导句点命名一样(这将文件指定为隐藏),没有延伸。
因此,在WP安装的根目录中创建.maintenace
文件(应与wp-config.php
,wp-login.php
等处于同一级别)。在此文件中添加以下内容:
<?php $upgrading = time(); ?>
这告诉WP该站点处于维护模式。注意:如果目录中的此文件不存在,则该站点将无法访问。
您可以修改维护模式消息的外观,甚至可以在其上放置计时器,以便在一段时间后网站重新开启。有关详细信息,请参阅here。
完成此操作后,请检查站点以确保维护模式正在进行。如果是,请将.maintenance
重命名为.maintenance_off
。这将是我们此文件的默认状态;它将位于名为.maintenance_off
的位置,允许网站正常运行,直到您希望在将其重命名为.maintenance
时启用维护模式。
我已经厌倦了编写维护模式,所以从现在开始我将维护模式称为m-m,好吗?
现在是脚本;
在您希望能够打开和关闭此WP安装的每个WP安装上,您将需要两件事:
.maintenance_off
文件; 在WP安装的根目录中创建一个名为remote_maint.php
的文件,与.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
的{{1}}数组。然后,$p
函数将针对脚本顶部的密钥集turn_on()
)检查请求中发送的密钥($p['key']
);如果匹配,它会将$key
重命名为.maintenance_off
,有效地打开m-m。如果密钥与请求不匹配,则会将页面标题设置为.maintenance
,如下所示。
有了这一切,中央司令部的时间;将要进行调用的代码。在我的测试中,我选择了jQuery,这样就可以在同一页面上的多个站点上打开和关闭m-m而无需重新加载。
在另一个网站上,或者您想要管理mm的任何地方,创建一个名为401 Unauthorized
的页面(实际上它不必是.php,可以是.html,或者其他),并添加以下内容:
remote_maint_admin.php
将<!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>
更改为您的网址。要添加更多站点,请复制主div并重复它:
http://site.com/
这里有另一个快乐的小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>
...并将输入ID编号(例如<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编号(例如id='key-2'
更改为id='status-1'
和javascript调用(例如{{ 1}}分别为您要添加的每个网站id='status-2'
...
现在,当您将密钥输入文本框并点击“打开”或“关闭”时,js将获取您的密钥和模式(取决于您点击的按钮)并将其发送到其他服务器。如果密钥匹配,则m-m将打开或关闭,按钮下方的div将更新并说明请求已完成。如果键不匹配,按钮下方的div仍将表示请求已完成,但m-m不会更改。我以为我可以使用返回的页面状态代码更新状态div,这就是为什么我将标头设置为401失败的原因,但是由于相同的原始策略,跨站点请求状态代码总是返回为{{1 }}。但是,如果你使用像Firebug这样的工具,你可以在那里观察控制台,看看请求是否真的失败......
HTH
答案 1 :(得分:0)
您可以安装维护模式plugin,然后在该代码中找到触发器以打开维护模式,然后注入一个函数(例如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
语句,如下所示:< / p>
if (substr($this->g_opt['mamo_activate'], 0, 2)=='on' || check_for_external_var()=='on'){...
这将检查是否已从wordpress管理员或您的外部网站打开任何维护模式;在任何一种情况下,它都将激活维护模式。
编辑:
实际上,上述方法(我认为)并不适用。
我能想到在某个地方关闭外部var的唯一原因是关闭您的网站,这样您就可以同时关闭多个网站。这很接近吗?
如果是这种情况,那么在外部站点上创建一个脚本会更有意义,该脚本会对您的WP安装执行GET
,从而使它们进入维护模式。要在运行WP安装的站点内执行此操作,您需要运行一个检查外部站点n
秒的脚本。这会产生很多开销,并且可能不可靠。
更好的解决方案是在外部站点上安装一个脚本,当访问该脚本时,将在WP安装上启动URL
,以启动维护模式。