博主介绍: 大家好,我是想成为Super的Yuperman,互联网宇宙厂经验,17年医疗健康行业的码拉松奔跑者,曾担任技术专家、架构师、研发总监负责和主导多个应用架构。
近期专注: RPA应用研究,主流厂商产品使用,开源RPA 应用,包括UI.Vision、taskUI、taskt、OpenRpa、Robot Framework等
技术范围: 长期专注java体系,软件架构,DDD,多年java、golang、.Net、redis、nginx、tomcat、mysql、oracle等经验
业务范围: 对传统业务应用技术转型,从数字医院到区域医疗,从院内业务系统到互联网医院及健康服务,从公立医院到私立医院都有一些经历及理解
*** 为大家分享一些技术积累,欢迎交流合作 持续关注Yuperman ***
本文介绍一种通过nginx对请求进行过滤的方法,实现按日期时间进行访问控制的方式实现。
网站也有不少介绍nginx实现日期时间控制访问请求的文档,大多都用不了,所以记录此文
nginx系列文章
【nginx】生产环境中按日期时间访问控制的实现
【nginx】网页刷新不定时502错误,10048错误
nginx配置vue项目404错误,浏览器手动刷新404
nginx中如何设置gzip
由于客户项目在年底需要进行临时的考虑,需要大量对业务系统进行报表及统计查询,为了避免大量业务统计查询及导出下载功能对业务应用产生影响,所以提出限制用户只能在12月份的每天固定时间进行操作
对于业务系统或指定请求在固定时间段允许访问,某些时间段禁止访问,通过路由层控制是最简单灵活的方法。
通过nginx实现控制如下:
1) Nginx的时间模块
Nginx提供了一个叫做ngx_http_time_module的时间模块,该模块可以帮助我们根据当前时间来对请求进行访问控制。这个时间模块包含了很多有用的指令,如$time_iso8601、$time_local、$time_gmt等,它们可以用于获取当前服务器时间,并进行时间相关的判断。
注:本文使用的是变量$time_iso8601,$time_iso8601的日期格式需要大家注意,如果不清楚格式,可以把这个值打印到日志文件中
2)通过nginx的map命令,设置日期时间规则
我们使用了map模块和正则表达式来匹配当前时间是否在工作时间范围内,并将匹配结果保存在$is_work_time变量中。
在http模块下编写map命令,$is_work_time变量可在多个server模块中复用。
http {
map $time_iso8601 $is_work_time {
default 0;
~*^2024-12-[0-3][0-9]T(1[3-8]):[0-5][0-9]:[0-5][0-9].* 1;
}
}
1、这里最重要的是通过正则匹配上请求中的日期时间变量$time_iso8601
需要明确本机中$time_iso8601的日期格式是:比如我的是2024-12-09T14:09:52+08:00,然后进行匹配
2、另外一个问题时,网上的很多文章都是在这个正则匹配上出错,验证后是无法使用的,包括正则里面有一些无效字符,格式不对等,需要进行测试
另外提供一些其他正则匹配的规则代码,有更好的写法也可以提出建议并分享
~*^2024-T.* 1;
~*^2024-12-T.* 1;
~*^2024-12-05T.* 1;
--2024年12月9:00-18:00可访问
~*^2024-12-[0-3][0-9]T(0[9-9]|1[0-4]):[0-5][0-9]:[0-5][0-9].* 1;
3)在location中通过if语句对$is_work_time变量逻辑判定
应用到我们想要限制访问的页面或资源的配置中,并进行判定。
server {
# 根请求会指向的页面
location / {
if ($is_work_time = 0) {
return 403;
}
try_files $uri $uri/ /index.html last;
index index.html;
}
}
4)不在允许的授权访问时间内,nginx调转至指定页面
server {
# 根请求会指向的页面
location / {
if ($is_work_time = 0) {
return 403;
}
try_files $uri $uri/ /index.html last;
index index.html;
}
error_page 403 /error/403.html;
location = /error/403.html {
root html;
}
}
这里监测到不在访问时间内则返回403访问未授权代码
同时跳转到指定的错误页,错误页统一放置在目录html/error下面,所以进行了路径配置