模板-富文本

博主介绍: 大家好,我是想成为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

1.需求场景

由于客户项目在年底需要进行临时的考虑,需要大量对业务系统进行报表及统计查询,为了避免大量业务统计查询及导出下载功能对业务应用产生影响,所以提出限制用户只能在12月份的每天固定时间进行操作

2.实现思路

对于业务系统或指定请求在固定时间段允许访问,某些时间段禁止访问,通过路由层控制是最简单灵活的方法。

通过nginx实现控制如下:

  • 通过nginx的map命令,设置日期时间规则
  • nginx的location中编写日期时间限制逻辑
  • nginx限制访问时,跳转至指定错误页

3.详细过程

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、另外一个问题时,网上的很多文章都是在这个正则匹配上出错,验证后是无法使用的,包括正则里面有一些无效字符,格式不对等,需要进行测试

另外提供一些其他正则匹配的规则代码,有更好的写法也可以提出建议并分享

  • nginx配置某年可访问,其他时间拒绝访问
   ~*^2024-T.* 1;
  • nginx配置某月可访问,其他时间拒绝访问 
   ~*^2024-12-T.* 1;
  • nginx配置某天可访问,其他时间拒绝访问
   ~*^2024-12-05T.* 1;
  • nginx配置某个时间段可访问,其他时间拒绝访问
--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下面,所以进行了路径配置

你可能感兴趣的:(nginx,运维)