apache基于时间的访问限制必须用require expr指令,依赖服务器本地时区的时间变量(如time_wday、time_hour),禁用mod_rewrite;需启用mod_authz_core和mod_authz_host模块。

Apache 实现基于时间的访问限制,必须用 Require expr 指令,在授权阶段判断服务器本地时间,不能依赖 mod_rewrite —— 后者仅用于重写,无法可靠拦截请求,尤其在有 CDN、缓存或反向代理时容易失效。
确认模块已启用
确保以下两个模块已加载(Apache 2.4+ 默认开启,但需验证):
mod_authz_coremod_authz_host
检查命令:apachectl -M | grep authz。若未出现,需在主配置中取消注释:
LoadModule authz_host_module modules/mod_authz_host.so
写对时间表达式
Apache 时间变量是整数,按服务器本地时区解析(不是 UTC,也不是浏览器时区),关键变量有:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
time_wday:星期几,周日=0,周一=1,…,周六=6 -
time_hour:小时,0–23,无补零(如 9 点就是9,不是09) -
time_min:分钟,0–59,无补零
例如,“仅允许周一至周五 8:30–17:30 访问 /static/report.pdf”应写为:
time_wday >= 1 && time_wday = 8 && (time_hour配置到具体资源路径
推荐使用 <location></location> 块匹配 URL 路径(比 <files></files> 更准,且不依赖文件系统结构):
Require all denied
Require expr "time_wday >= 1 && time_wday = 8 && (time_hour
注意三点:
- 必须用
<requireall></requireall>包裹,否则Require all denied会被后续规则覆盖 - 不能省略
Require all denied,否则默认放行 - 不要把
<location></location>写在<directory></directory>内部——二者作用域不同,嵌套会导致配置无效
排查常见失效原因
规则写对却没效果?重点检查:
-
.htaccess 干扰:若目标路径下存在
AllowOverride All和.htaccess,其中的Require all granted会覆盖主配置,临时注释掉测试 -
时区未同步:运行
date确认服务器当前时区是否符合预期;必要时执行timedatectl set-timezone Asia/Shanghai -
缓存穿透:CDN 或浏览器可能返回旧响应;测试时加参数(如
?t=123)或用curl -I查看真实状态码









