配置 Nginx 基于时间控制网页访问

今天,突发奇想,要控制我的网站在 6:00-23:00 之间访问,其余时间不让访问,为了让我们休息,不要太操劳了。

网上搜索了一番,还真可以,现在就实践一把。

如果要限制 IP,请使用 allow 和 deny 指令。

例如,禁止某个 IP 访问就使用 deny IP,要允许某个 IP 访问就使用 allow IP,禁止所有就是 deny all,允许所有就是 allow all。常见的应用场景,管理后台,工具站等。还有一种方案就是使用防火墙限制,更安全一些。

不满足需求,我们继续搜索时间段限制。

Nginx 提供了一个叫做 ngx_http_time_module 的时间模块,该模块可以帮助我们根据当前时间来对请求进行访问控制。这个时间模块包含了很多有用的指令,如$time_iso8601、$time_local、$time_gmt 等,它们可以用于获取当前服务器时间,并进行时间相关的判断。

现在配置网站在每天 6:00-23:00 访问,当配置网站后,生效了,但是体验很差,就将配置加在了管理后台。

首先,定义一个变量,用于获取当前时间:

map $time_iso8601 $currtime {
		default 0;
		"~^(\d{4})-(\d{2})-(\d{2})T(0[6-9]|1[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])" 1;
	}

上面的配置,使用了 map 模块和正则表达式。map 不能配置在 Server 区块内,请配置在 Http 区块内。

现在,我们将变量$currtime 应用到我们的资源配置中:

这是一种写法,设置一个变量,解决 else 问题。

location / {
    set $ok 0;
    if($curr_time=1){
        // 访问页面资源
        set $ok 1;
    }

    # 如果没有匹配到,跳转到这个页面
    if($ok=0){
        // 访问广告页
    }
}

我们的需求简单,这里可以简化成

location / {
    if($curr_time=1){
        // 访问页面资源
    }
    if($curr_time=0){
        // 访问广告页
    }
}

应用到我的网址,测试一下是否正常。

上面的配置是自己想简单了,真实的情况如下:

location / {
            if ($currtime = 0) {
                return 403 "该休息了,这个时间段不允许访问!";
            }

            index index.html;
        }

在页面前进行拦截,if 内不支持 index 指令。理论上来说,是可以根据时间段跳转到不同的页面。使用 return 指令添加跳转的 URL 地址。我这里为了简单,就直接返回 403 上了,在浏览器上显示的现象是页面无法打开。