【问题标题】:How can I "close" a website on Sundays only我怎样才能只在周日“关闭”一个网站
【发布时间】:2016-03-12 22:53:33
【问题描述】:

我正在寻找一个脚本,它将网站的所有页面重定向到一个页面,该页面声明整个网站在周日因宗教原因关闭。

它应该只在周日重定向。在一周中的所有其他日子,该网站都应正常运行。

我想在服务器级别的 .htaccess 文件或 PHP 脚本中执行此操作。

我可以想象这样的事情:

$day = date('w');
if ($day == 0) { // Sunday...
    header("Location: http://www.domain.com/closedonsunday.html");
}

【问题讨论】:

    标签: php .htaccess redirect


    【解决方案1】:

    您可以在.htaccess 中使用以下规则:

    RewriteEngine on
    
    #--if WDAY ==0--#
    RewriteCond %{TIME_WDAY} 0
    
    #--redirect the domain to /closedonsunday.html--#
    RewriteRule ^((?!closedonsunday\.html).*)$ /closedonsunday.html [L,R]
    

    %{TIME_WDAY} 变量表示星期几 (0-6)。

    如果满足条件,上面的代码会将所有请求重定向到/closedonsunday.html

    【讨论】:

    • 有效!然而,仅适用于主页,而不适用于所有页面。我可以在这里问你的指导吗?
    • @Anthony 调整 rewriteRule 中的匹配器正则表达式,使其适合您的需求。阅读docs 中的语法(但它基本上只是 pcre)
    • @SáT 所以我做了最后几个小时。 “最佳”结果是获得 500 个内部服务器错误,例如 ERR_TOO_MANY_REDIRECTS 代码也像 Options +FollowSymlinks RewriteEngine on RewriteCond %{REQUEST_URI} !/closedonsunday$ RewriteRule $ /closedonsunday.html [R=302,L] 似乎不起作用我的情况。
    • @Anthony 您可以检查您的服务器日志以查看有关错误的更多详细信息。此外,请阅读 mod_rewrite 的工作原理以及重定向的执行方式。 Sacred Flowchart 对我了解这只野兽有很大帮助。
    • 非常感谢。流程图很完美!
    【解决方案2】:

    您可以使用date() 获取星期几的数字表示并重定向:

    $day = date('N'); //1 (for Monday) through 7 (for Sunday)
    if($day == 7){
        header("Location: sunday_page.php");
    }
    

    通过 PHP 将这段代码放在标题的最顶部是非常好的。

    【讨论】:

      【解决方案3】:

      我不会对 header 执行此操作,因为根据他们的浏览器设置,用户可能在星期一以外的日子获得页面的缓存副本。

      您可以使用include 从另一个文件执行脚本。在每一页的顶部添加以下内容:

      include 'path/to/closedonsunday.php';
      

      然后closedonsunday.php 将进行非常简单的检查,例如:

      if (date('w') == 0) {
          /* ... message here ... */
          exit;
      }
      

      exit 是这里的重要部分,因为它将阻止 PHP 死机。

      您还应该注意时区。确保您的服务器时钟设置正确,并且您的脚本知道它应该使用哪个时区!

      【讨论】:

      • 嗨,非常感谢,特别是在缓存副本和服务器时钟设置方面。我想将包含在每个页面的顶部对于拥有超过 1.000 个页面的网店来说是一件相当大的事情。就您而言,是否有单页解决方案?
      • 这取决于您的应用程序设计。我倾向于在每一页上总是有一个include 语句,这样身份验证和数据库连接等事情就可以只在一个地方处理(这将是一个“单页解决方案”)。如果您有超过 1,000 个页面目前没有 include 任何内容,那么需要大量工作来修改它们。在这种情况下,此处另一个答案中的.htaccess 方法将减少工作量。
      【解决方案4】:

      在我看来,您应该使用 .htaccess 文件。 .htaccess 中的日期和时间值采用

      格式

      %{TIME_XXXX}

      其中 XXXX 是您想要的日期或时间类型。

      如果您想将通用网址重定向到包含今天日期的网址,您可以使用:

      重写规则 ^posts/today$ /posts/%{TIME_YEAR}-%{TIME_MON}-%{TIME_DAY}

      这将导致 /posts/today 被重定向到 /posts/2015-08-27 之类的内容

      如果您想在日期(和时间)是密码之后重定向页面,您可以使用类似以下的内容,如果日期在 2015 年 8 月 27 日上午 9 点过去,则将发生重定向。我们使用简单的数字比较,将日期转换为整数,然后进行比较。

      RewriteCond %{TIME_YEAR}%{TIME_MON}%{TIME_DAY}%{TIME_HOUR} >2015082709
      RewriteRule ^$ /destination/url.html [R=301,L]
      

      你的情况

      RewriteCond %{TIME_WDAY} = 0 // condition
      RewriteRule URL on which you wants to redirect
      

      更多教程,您可以使用链接Tutoriallink 2

      如果您想使用 PHP 方式,请使用开关。如果以后您也想在其他任何一天重定向,那么您可以在此处进行管理。

      $day = date('N'); //1 for Monday , 2 for Tuesday ... 7 For Sunday
      //N is  The ISO-8601 numeric representation of a day
      switch($day){
      case 1:
        header('location: site for Monday');break;
      case 2:
        header('location: site link for Tuesday'); break;
      }
       . 
       .
      case 7: 
       header("Location: http://www.domain.com/closedonsunday.html"); break;
      default:
          code to be executed if day is different from all labels; // it is not possible in this case :)
      

      }

      【讨论】:

      • 感谢您的 htaccess 教程。我是否正确,每个星期天都会重定向网站:RewriteCond %{TIME_DAY} = 0 RewriteRule ^$ /destination/url.html [R=301,L]
      • 没有 TIME_DAY 代表当前日期。您应该 TIME_WDAY 当前工作日 (0-6)。
      • 你也可以使用switch case。 Switch 总是比 If else 条件好。
      • 如果您无法解决问题,请随时询问。
      猜你喜欢
      • 2016-04-06
      • 2023-01-11
      • 1970-01-01
      • 1970-01-01
      • 2019-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多