Apache的mod_rewrite可基于服务器本地时间实时分流,但仅限URL重写(如跳转、代理),不适用于严格访问控制;应使用Require expr实现时段授权限制。

Apache 的 mod_rewrite 可以基于服务器本地时间做实时分流,但仅限于 URL 重写层面(比如跳转、代理),不能替代授权控制。它适合做“时段导向型路由”,例如凌晨切维护页、工作日导主站、周末导备用页等。关键在于用好 %{TIME_HOUR}、%{TIME_MIN}、%{TIME_WDAY} 这类内置变量——它们每次请求都刷新,返回字符串格式,需按字典序比对。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
时间变量怎么用才不出错
所有时间变量都是字符串,不是数字:
• %{TIME_HOUR} 返回 "00" 到 "23"(两位补零)
• %{TIME_MIN} 返回 "00" 到 "59"
• %{TIME_WDAY} 返回 "0"(周日)到 "6"(周六)
错误写法:RewriteCond %{TIME_HOUR} >2(不支持运算符)或 ^2|3|4$(会误匹配单字符)
正确写法:^0[2-5]$ 表示 02–05 点,^[1-5]$ 表示周一至周五
常见分流场景的写法示例
• 凌晨 2–5 点导流到维护页:RewriteCond %{TIME_HOUR} ^0[2-5]$\nRewriteRule ^(.*)$ /maintenance.html [R=302,L]
加前置排除防循环:RewriteRule ^maintenance\.html$ - [L]
• 工作日 9:00–17:59 走主站,其余走备用站:RewriteCond %{TIME_WDAY} ^[1-5]$\nRewriteCond %{TIME_HOUR} ^09|1[0-7]$\nRewriteRule ^(.*)$ http://primary.example.com%{REQUEST_URI} [P,L]RewriteCond %{TIME_WDAY} ^[06]$\nRewriteRule ^(.*)$ https://backup.example.com%{REQUEST_URI} [P,L]
注意:小时段要拆开写,^09|1[0-7]$ 覆盖 09、10–17;18:00 后自动落入下一条规则
为什么不能靠 mod_rewrite 做严格访问限制
mod_rewrite 是重写引擎,不是授权模块。它在请求处理链中较晚执行,容易被缓存、CDN、HTTPS 终止或 .htaccess 中其他指令干扰。
• 若目标是“只允许某时段访问某路径”,应改用 Require expr(Apache 2.4+):
• 该方式在认证授权阶段生效,不可绕过,且 time_hour 等返回整数,逻辑更直观
调试和上线前要注意什么
• 先用 [R=302] 测试,避免 301 被浏览器缓存
• 开启 mod_rewrite 日志(LogLevel alert rewrite:trace3)看条件是否命中
• 检查服务器时区:date 命令输出必须与预期分流时段一致
• 不要试图用 %{ENV:} 存时间值——环境变量不会随请求刷新,每次都要用 %{TIME_} 实时取值
• 若配置在 .htaccess 中,确保父目录已设 AllowOverride All










