nginx实现指定时间段允许访问的功能

          杭州亚运会期间领导要求只允许工作日允许对外提供服务, 非工作日不允许访问. 刚开始打算写脚本定时kill和重启服务来实现, 但是有的服务虽然不允许访问可是一些后台定时任务还是需要持续跑的. 因此最终考虑通过nginx配置文件来限制非工作时间的访问.

        实现的思路是穷举所有不允许访问的日期和工作时间, 在不允许访问的时间请求时在nginx里直接拦截返回404. 当前配置是根据当前操作系统的时间来判断的. 因此需要保证操作系统时间正确.

1.首先通过$time_local获取日期09/Oct/2023:16:49:46 +0800. 并通过正则获取到当前的月, 日, 时, 分.

2.然后先判断日期是否是非工作日, 若是则直接返回404, 如果是允许访问的日期则再判断时, 分

3.排除掉所有不允许访问的请求后,剩下的正常返回

配置如下:

location / {
        # 获取本地时间
        if ( $time_local ~ "^(\d+)\/(\w+)\/(\d+):(\d+):(\d+):(\d+) \+(\d+)" ) {
          set $hour $4;
          set $day  $1;
          set $month $2;
          set $min $5;
        }
        
        set $flag "";
        if ($month = Sep) {
            set $flag "${flag}1";
        }
        if ($day ~ 09|10|16|17|23|24|29|30) {
            set $flag "${flag}2";
        }
        if ($flag = "12") {
            return 404;
        }
        
        set $flag1 "";
        if ($month = Oct) {
            set $flag1 "${flag1}3";
        }
        if ($day ~ 01|02|03|04|05|06|14|15|21|22|28|29) {
            set $flag1 "${flag1}4";
        }
        if ($flag1 = "34") {
            return 404;
        }
        if ($hour ~ 01|02|03|04|05|06|07|21|22|23|24) {
            return 404;
        }

        #8:30—20:00对外提供服务
        #判断是不是8:00 - 8:30
        set $flag3 "";
        if ($hour = 08) {
            set $flag3 "${flag3}5";
        }
        if ($min ~ 01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29) {
            set $flag3 "${flag3}6";
        }
        if ($flag3 = "56") {
            return 404;
        }
    
        root   html8002/pds;
        try_files $uri $uri/ /index.html;
        index  index.html index.htm;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值