可以,mod_rewrite 能用 %{TIME_HOUR} 等内置变量实时判断系统时间,但不支持 shell 命令或外部脚本;时间变量每次请求时刷新,基于服务器本地时区,字符串格式如 "03",需补零后字典序比较。

mod_rewrite 能否直接读取系统时间做条件判断
可以,但必须用 %{TIME_HOUR}、%{TIME_MIN} 这类内置变量,不能写 shell 命令或调用外部脚本。Apache 的 RewriteCond 支持时间变量,但仅限于启动时解析的静态快照(实际是每次请求时实时获取),不是 cron 式的后台调度。
常见误区是试图用 %{ENV:...} 或自定义环境变量存时间值——这行不通,因为环境变量在请求生命周期中不自动刷新;必须每次都用 %{TIME_...} 变量实时比对。
-
%{TIME_HOUR}返回 00–23 的两位字符串(注意是字符串,不是数字) -
%{TIME_MIN}同理,返回 00–59 -
%{TIME_WDAY}是 0(周日)–6(周六),可用于工作日分流 - 所有时间变量都基于服务器本地时区,不支持 UTC 或时区切换
如何写一个凌晨 2 点到 5 点指向维护页的规则
关键在于字符串比较要补零、用字典序逻辑。比如 "03" > "02" 成立,但 "5" "02" 会出错——所以必须统一用两位格式匹配。
RewriteEngine On
RewriteCond %{TIME_HOUR} ^02$ [OR]
RewriteCond %{TIME_HOUR} ^03$ [OR]
RewriteCond %{TIME_HOUR} ^04$ [OR]
RewriteCond %{TIME_HOUR} ^05$
RewriteRule ^(.*)$ /maintenance.html [R=302,L]更紧凑写法(正则范围匹配):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
RewriteCond %{TIME_HOUR} ^0[2-5]$
RewriteRule ^(.*)$ /maintenance.html [R=302,L]- 别用
^2|3|4|5$—— 这会匹配单字符,而%{TIME_HOUR}永远是两位 -
[R=302]推荐先用临时重定向,避免浏览器缓存错误响应 - 如果维护页需绕过重写(比如本身是静态 HTML),加一条前置排除:
RewriteRule ^maintenance\.html$ - [L]
如何实现工作日 9:00–18:00 走主站,其余时间走备用站点
需要同时判断星期几和小时段,且注意逻辑优先级:先满足「工作日」再检查「时段」,否则周末的 10 点也会被误判。
RewriteCond %{TIME_WDAY} ^[1-5]$
RewriteCond %{TIME_HOUR} ^0[9-9]|1[0-7]$
RewriteRule ^(.*)$ http://primary.example.com%{REQUEST_URI} [P,L]
<p>RewriteRule ^(.*)$ <a href="https://www.php.cn/link/280a8e9f937dc8c7b25269628a1ed964">https://www.php.cn/link/280a8e9f937dc8c7b25269628a1ed964</a>} [P,L]说明:
-
%{TIME_WDAY}周一=1,周五=5,所以^[1-5]$精确匹配工作日 -
^0[9-9]|1[0-7]$匹配 09, 10–17(注意不包含 18,因 18:00 属于“其余时间”) - 第二个
RewriteRule没有条件,作为兜底规则,必须放在条件规则之后 - 用
[P](proxy)而非[R],才能隐藏目标域名;前提是已启用mod_proxy和mod_proxy_http
为什么重启 Apache 后时间规则没生效或行为异常
最常见原因是配置未加载或语法错误导致整段 Rewrite 被跳过。Apache 不会单独报“时间条件无效”,而是静默忽略有误的 RewriteCond 行,后续规则仍执行。
- 检查
mod_rewrite是否启用:a2enmod rewrite(Debian/Ubuntu)或确认LoadModule rewrite_module在httpd.conf中未被注释 - 确保
RewriteEngine On出现在规则块最上方,且作用域正确(virtualhost / directory / .htaccess) - 在
.htaccess中使用时间变量需允许FileInfo覆盖权限:AllowOverride FileInfo - 时间变量只在请求处理阶段可用,不能用于
VirtualHost全局配置的早期阶段(如ServerName计算)
真正麻烦的是时区偏差——如果服务器时区设成 UTC,但业务按北京时间运营,所有时间判断都会偏移 8 小时。这个点容易被忽略,且无法靠 rewrite 规则修正。

















