Nginx中限制目录访问时间需用map提取$time_iso8601的小时等字段为变量,在location中用if+return实现时段控制;推荐在http块定义map映射$hour,再通过字符串比较拦截非允许时段请求。

在 Nginx 中限制特定目录的访问时间窗口,核心是结合 map 指令与内置变量 $time_iso8601(或 $date_gmt)提取小时、分钟等时间信息,再用 if + return 或 deny 实现时段控制。注意:不能直接在 location 块内写复杂时间逻辑,需提前映射。
提取并映射当前小时(推荐方式)
利用 map 将 ISO8601 时间字符串中的小时部分提取为整数变量,便于后续条件判断。该操作必须放在 http 块顶层:
http {
map $time_iso8601 $hour {
~^(\d{4}-\d{2}-\d{2})T(\d{2}):\d{2}:\d{2}Z$ $2;
}
}
这样,变量 $hour 就能稳定表示 00–23 的两位数字字符串(如 "09"、"14"),可用于比较。
在 location 中按小时范围拦截请求
针对目标目录(例如 /admin/),在对应 location 块中使用 if 判断小时是否在允许区间外。例如只允许工作日 9:00–18:00 访问:
- 先用
if ($hour 拦截早于 09 点的请求 - 再用
if ($hour > "18") { return 403; }拦截晚于 18 点的请求 - 注意:字符串比较对 "09"、"10"…"18" 有效;但若需跨午夜(如 22:00–06:00),建议转为数值比较或用
geo+map组合处理
扩展支持分钟级或工作日限制
若需更精细控制(如仅周一至周五 9:30–17:45),可额外映射:
- 用
map $time_iso8601 $weekday提取星期几($1匹配T\d{2}:\d{2}:\d{2}Z前的日期,再配合外部脚本或 Lua 更可靠;纯 Nginx 推荐用geo模块配合定时任务生成 weekday 文件) - 分钟可用类似正则:
~^.*T\d{2}:(\d{2}):\d{2}Z$ $1映射为$minute,再组合判断 - 实际生产中,涉及多维度时间规则时,建议启用
nginx-lua-module,用 Lua 脚本统一处理日期解析和逻辑判断,更清晰可靠
验证与注意事项
配置后务必重载 Nginx 并测试边界时间点(如 08:59、09:00、18:00、18:01):
- 确保服务器时区与业务预期一致(
$time_iso8601默认 UTC,如需本地时间,需在系统层面设好timezone,Nginx 自身不转换时区) -
if在location内是安全的,但避免嵌套或在server根层级滥用 - 返回 403 比重定向更合适,避免暴露路径意图;也可返回自定义错误页:
error_page 403 /403-restricted.html;











