网站维护模式[关闭]

Posted

技术标签:

【中文标题】网站维护模式[关闭]【英文标题】:Website Maintenance Mode [closed] 【发布时间】:2015-10-09 20:37:10 【问题描述】:

我正在尝试在我们的网站上创建一个相当简单但有效的维护设置。该函数的工作方式是,如果用户登陆站点上的任何页面,除了https://www.ourbusiness.org/assets/home2.do/unlock-maintenancehttps://www.ourbusiness.org/legal/all 之外,header() 函数将启动并将用户重定向到https://www.ourbusiness.org/error/offline/。我看过其他问题,尤其是this one,但在这个问题中,我认为可以改进;通过添加这么少量的代码。

首先是我们的config.php 文件:

Config.Run.php:

<?php
define("URL", "https://www.ourbusiness.org");
define("MAINTENANCE", "1");

if(MAINTENANCE == 1) 
    if(!isset($_SESSION['MAINTENANCE_UNLOCK'])) 
        header("Location: ".URL."/error/offline/");
    

unlock-maintenance.php

<?php
    include "Config.Run.php";
    session_start();

    if(isset($_POST)) 
        if($_POST['username'] == "admin" && $_POST['password'] == "admin") 
            $_SESSION['MAINTENANCE_UNLOCK'] = md5($_POST['username'].$_POST['password']);
            header("Location: ".URL."");
        
    
?>
<form action="" method="post">
    <h1>You are not logged in</h1>
    <b>Username: </b><input type="text" name="username" />
    <b>Password: </b><input type="password" name="password" />
    <input type="text" value="Unlock <?php echo TITLE; ?>" />
</form>

为什么这不起作用?我什至无法访问该文件来解锁网站,也无法访问目录legal中的任何页面

【问题讨论】:

在包含试图将会话用于一件事的 php 文件之后,您正在调用 session_start()。另一件事 - 每个用户都有自己的会话,不应该“解锁”维护是全局的,即首先不基于会话吗? @JamesThorpe 维护设置是全局的,它由MAINTENANCE const 控制。会话变量允许用户只为自己覆盖设置(例如站点管理员)。 md5($_POST['username'] lordie,不要使用它,不要用于密码存储。也许.......也许回到 1992 年的第一个月左右。 @Dai 是的,我现在明白了。尽管如此,session_start() 还是需要先调用。 这不是为了安全,它只是在网站停止维护之前解锁网站的一种方式,这样我们就可以看到更新是如何生效的。 【参考方案1】:

简短的回答是......

session_start();

if(isset($_POST)) 
    if($_POST['username'] == "admin" && $_POST['password'] == "admin") 
        $_SESSION['MAINTENANCE_UNLOCK'] = md5($_POST['username'].$_POST['password']);
        header("Location: ".URL."");
    


include "Config.Run.php";

ALSO.. 在其他脚本上做..

if(MAINTENANCE == 1 && !isset($_SESSION['MAINTENANCE_UNLOCK'])) 
        header("Location: ".URL."/error/offline/");
    

..把这些换成这样。我知道我应该包含详细信息,但它们在 cmets 中。

【讨论】:

我收到了 TOO_MNY_REDIRECTS 错误 @RRAWebteam - 看起来您的会话变量没有被保存。你有没有像我的例子一样把 session_start() 放在顶部? 我已经完成了上面所说的一切......但是现在当我尝试访问解锁页面时,我被重定向到离线页面 当我让用户离开页面时,他们应该是某种声明吗?我只是不知道什么?还是写错了? @RRAWebteam 查看我的编辑。【参考方案2】:

如果有人决定使用它,请注意它不是最安全的身份验证系统

在对我们的代码进行一些修改后,我已经解决了这个问题 - 我想出了一个解决方案,它非常有效。请在下面查看我们的结果:

在我们的Config.Run.php内部:

define("URL", "https://www.ourbusiness.org");
define("MAINTENANCE", "1");

if(MAINTENANCE == 1) 
    if(!isset($_SESSION['MAINTENANCE_UNLOCK'])) 
        $current_file = explode('/', getcwd());
        $current_file = end($current_file);
        if ($current_file !== 'unlock-maintenance' && $current_file !== 'offline') 
            header("Location: ".URL."/error/offline/");
            exit();
        
    

在我们的unlock-maintenance目录中(默认文件index.php

<h2>Maintenance log in</h2>
<?php
if(isset($_POST) && !empty($_POST)) 
    if($_POST['username'] == "admin" && $_POST['password'] == "admin") 
        $_SESSION['MAINTENANCE_UNLOCK'] = md5($_POST['username'].$_POST['password']);
        header("Location: ".URL."");
     else 
        echo '<p class="err_msg">That login attempt failed, please try again.</p>';
    
 else 
    echo '<p>You must login using your username and password.</p>';


?>
<form action="" method="post">
    <div class="input_group">
        <label>Username</label>
        <input type="text" class="input" name="username" value="">
    </div>
    <div class="input_group">
        <label>Password</label>
        <input type="password" class="input" name="password" value="">
    </div>
    <input type="submit" value="Login" />
</form>

我希望这对那些一直在寻找一个相当好的维护系统的人有所帮助。

请记住,您可以向此添加注销链接添加更多功能,更改页眉/页脚包含取决于是否登录等。

【讨论】:

以上是关于网站维护模式[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

维护页面控制[关闭]

Wordpress:网站一部分的维护模式

在asp.net核心中实现“维护模式”

SQLServer数据库镜像高性能模式下维护

维护模式与中间件在 Laravel 中重定向

如何全屏制作asp网站? [关闭]