如何在已建立的网站上实施“维护模式”

Posted

技术标签:

【中文标题】如何在已建立的网站上实施“维护模式”【英文标题】:How to implement "Maintenance Mode" on already established website 【发布时间】:2010-11-26 16:18:53 【问题描述】:

我已经建立了一个包含 60 多个页面的网站 (php)。我现在才意识到(不幸的是)我应该内置一个“维护模式”功能,以允许管理员暂时禁用网站并将其指向维护模式页面。这将只允许以管理员身份登录的用户查看该网站。

我看到的选项是:

    在每个 PHP 页面的顶部添加一个新的“包含”文件。

    我有一个用于显示导航栏的包含 每个页面(导航类)。我可以编写维护模式 此类中的代码。

我还有其他选择吗?第一个选项似乎不是最有效的,第二个似乎是糟糕的编程。还有其他更好的方法可以在每个 php 文件中包含一个新文件吗?

谢谢!

ps - 该网站尚未启动

【问题讨论】:

【参考方案1】:

您可以在维护模式下使用.htaccess 重定向到另一个页面。

三个分类示例:

RewriteEngine On
RewriteBase /
RewriteCond %REMOTE_ADDR !^11\.111\.111\.111
RewriteCond %REQUEST_URI !^/maintenance\.html$
RewriteRule ^(.*)$ http://domain.com/maintenance.html [R=307,L]

.htaccess “Down For Maintenance” Page Redirect

Options +FollowSymlinks
RewriteEngine on
RewriteCond %REQUEST_URI !/maintenance.html$ 
RewriteCond %REMOTE_HOST !^888\.888\.888\.888

RewriteRule $ /maintenance.html [R=302,L] 

Redirect to maintenance page during upgrade using .htaccess

# redirect all visitors to alternate site but retain full access for you
ErrorDocument 403 http://www.alternate-site.com
Order deny,allow
Deny from all
Allow from 99.88.77.66

Maintenance mode for apache

【讨论】:

如您在示例中所见,您可以排除某些 IP。 这看起来是一个不错的快速选择。我希望找到其他可能更具可扩展性的方法,这样每次我有一个新管理员时,我就不必更新 .htaccess 文件并输入他们的 IP。也许我有点超前了?明年我可能不会有很多新管理员。也许现在实施一个简单的快速 .htaccess 修复程序会起作用,直到我真的需要实施健壮的方法。你们有什么感想?现在以“正确”的方式构建它会更好吗?还是只做简单的方法,直到我需要让它变得更复杂? 在所有选项中,我会说这是最好的方向。它为您提供了最大的灵活性和对整个站点的控制。 嗯,这听起来是目前最好的解决方案,直到我真的需要构建一些复杂的东西,考虑到这只需要我几分钟的时间。 顺便说一句,如果其他人使用此方法,您需要在 .htaccess 文件中添加一行以允许任何外部 css 文件。要允许所有 css 文件使用:%REQUEST_URI !.css$【参考方案2】:

我知道这是一个老问题,但我正在为未来通过搜索访问此页面的搜索者添加此问题。

我使用 PHP 重定向。

在每一页的顶部添加以下行:

<?php
include('PATH/TO/FILE/config.php');
if(maintenance == 1) 
header('Location: http://example.com/maintenance.php');

else 
// do nothing

?>

然后在你的 config.php 文件中创建一个像这样的变量

$maintenance = 0; // turns maintenance mode off

当您希望您的网站处于维护模式时,只需将“0”更改为“1”即可。 这会将您的所有网站访问者重定向到维护页面。

我在没有测试的情况下很快输入了该代码,但它应该可以工作。

【讨论】:

好吧,这行不通,您的标题缺少撇号。否则,我也想过同样的想法,但 htaccess 对于大型网站看起来要好得多 记得清理所有与config.php相关的字节码ma.ttias.be/how-to-clear-php-opcache 为什么不把 header('..') 放在配置文件中?【参考方案3】:

auto_prepend_file字符串

指定在主文件之前自动解析的文件名。文件被包含,就好像它是用 require() 函数调用的一样,所以使用了 include_path。

特殊值 none 禁用自动前置。

您可以在 php.ini 或 apache(虚拟)主机文件或 .htaccess 中使用 php_flag auto_prepend_file file.php 进行设置

[或 php_admin_flag (?)]

编辑

也许您不应该将包含文件放在您的 Web 根目录或子文件夹中。 记得在最后调用 exit 或死。

【讨论】:

您可以在末尾添加exit; 以阻止其余代码被解析。 @alex:是的。不应该假设人们仅仅因为他们有 60 多页的 php 就知道退出。 :我 哈哈是的,谢谢。创建大量文件很容易,但仍然不知道自己在做什么:P 感谢 OIS 分享有关 auto_prepend_file 的信息。我不知道这一点,我相信它稍后会派上用场。 :)【参考方案4】:

您也可以在 RewriteCond 中检查 HTTP_USER_AGENT,而不是指定 IP 地址。

RewriteCond %HTTP_USER_AGENT !MyCrazyString
RewriteCond %THE_REQUEST !upgrade\.txt
RewriteRule .* /upgrade.txt [R=307,L]

浏览器的用户代理字符串末尾带有“MyCrazyString”标签的任何人都可以访问,其他人都可以访问维护模式页面/站点。

只要不需要高安全性,它就是理想的;快速轻松地向管理员传播,完全可移植,重要的是,如果您重新连接您的 DSL,当唯一具有实际服务器访问权限的人在世界另一端睡着时,它也不会中断。 p>

;o) 关联

【讨论】:

【参考方案5】:

最简单的方法是集中一些有关站点生成的逻辑。这样您就可以打开维护模式并将任何非管理员重定向到不同的页面。这并不难做到,因为我想您有一些代码会不断弹出,所以只需扩展登录功能以检查全局变量(如果您的页面中没有任何公共全局变量您可以通过 setenv 将其设置在 .htaccess 中)。

【讨论】:

【参考方案6】:

我认为standard Apache expressions 比rewrite rules 更容易理解。

在维护之前,我将文件 /home/coolcmd/site_maintenance_off 重命名为 /home/coolcmd/site_maintenance_on

/.htaccess 的代码 sn-p:

# If file, directory or symlink /home/coolcmd/site_maintenance_on exists,
# and requested file is not /maintenance.html,
# and not an admin's IP...
<If "-e '/home/coolcmd/site_maintenance_on' && %REQUEST_URI != '/maintenance.html' && %REMOTE_ADDR != '111.111.111.111'">
# Generate status code 503 for URL beginning with /, in other words for ANY URL.
# This is not "the real redirection 3xx".
Redirect 503 "/"
# This page handles status code 503. All external resources used by page
# (for example, maintenance.css), if any, must be added to <if> above.
ErrorDocument 503 /maintenance.html
# Maintenance probably will end in 10 minutes.
Header set Retry-After 600
</If>

【讨论】:

以上是关于如何在已建立的网站上实施“维护模式”的主要内容,如果未能解决你的问题,请参考以下文章

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

考虑到 SEO 的维护模式策略

如何将你的 WordPress 网站置于维护模式

如何将你的 WordPress 网站置于维护模式

如何将你的 WordPress 网站置于维护模式

将网站置于维护模式?