插件窝 干货文章 Nginx如何实现基于时间的访问控制配置

Nginx如何实现基于时间的访问控制配置

Nginx server 时间 模块 327    来源:    2025-04-10

Nginx基于时间的访问控制配置

Nginx可以通过多种方式实现基于时间的访问控制,以下是几种常见的方法:

1. 使用Nginx的time模块(需要编译安装)

Nginx官方没有内置时间判断模块,但可以通过第三方模块如ngx_http_rewrite_module结合条件判断实现:

server {
    listen 80;
    server_name example.com;

    # 允许访问的时间段(8:00-18:00)
    set $allow_access off;

    if ($time_local ~ "08:00:|09:00:|10:00:|11:00:|12:00:|13:00:|14:00:|15:00:|16:00:|17:00:") {
        set $allow_access on;
    }

    if ($allow_access = off) {
        return 403;
    }

    # 其他配置...
}

2. 使用Lua脚本(需要安装ngx_lua模块)

更灵活的方法是使用Lua脚本:

server {
    listen 80;
    server_name example.com;

    access_by_lua_block {
        local current_hour = tonumber(ngx.localtime("%H"))
        if current_hour < 8 or current_hour >= 18 then
            ngx.exit(ngx.HTTP_FORBIDDEN)
        end
    }

    # 其他配置...
}

3. 使用Nginx的map指令

map $time_iso8601 $deny_access {
    default 0;
    "~T0[0-7]" 1;    # 00:00-07:59
    "~T19"     1;    # 19:00-19:59
    "~T2[0-3]" 1;    # 20:00-23:59
}

server {
    listen 80;
    server_name example.com;

    if ($deny_access) {
        return 403;
    }

    # 其他配置...
}

4. 基于星期几的访问控制

map $time_iso8601 $deny_weekend {
    default 0;
    "~*-W[6-7]" 1;  # 周六和周日
}

server {
    listen 80;
    server_name example.com;

    if ($deny_weekend) {
        return 403;
    }

    # 其他配置...
}

5. 结合GeoIP模块实现时区控制

如果需要根据客户端所在时区控制访问:

geoip_country /usr/share/GeoIP/GeoIP.dat;
geoip_city /usr/share/GeoIP/GeoLiteCity.dat;

server {
    listen 80;
    server_name example.com;

    set_by_lua $client_timezone '
        local tz = ngx.var.geoip_time_zone or "UTC"
        return tz
    ';

    access_by_lua '
        local tz = ngx.var.client_timezone
        -- 这里可以根据时区计算客户端当前时间
        -- 然后进行时间判断
    ';

    # 其他配置...
}

注意事项

  1. 时间判断基于Nginx服务器的时间,确保服务器时间准确
  2. 使用if指令时要小心,它有一些限制和陷阱
  3. 对于生产环境,建议使用Lua脚本方式,它更灵活可靠
  4. 这些配置可能需要额外的模块支持,请确保你的Nginx编译时包含了所需模块

以上方法可以根据实际需求组合使用,实现复杂的基于时间的访问控制策略。