配置 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 上了,在浏览器上显示的现象是页面无法打开。