如何编写按星期、时段匹配的.htaccess RewriteCond重定向规则
.htaccess 按星期、时段自动重定向实现方案
先明确mod_rewrite内置时间变量的取值标准,匹配逻辑基于以下定义:
%{TIME_WDAY}:星期标识,取值0-6,对应关系为 0=周日、1=周一、2=周二、3=周三、4=周四、5=周五、6=周六%{TIME_HOUR}:服务器当前时间小时数,24小时制,取值00-23%{TIME_MIN}:服务器当前时间分钟数,取值00-59
注意:TIME_*系列变量读取的是服务器本地时区时间,如果业务面向特定时区用户,请先将服务器时区调整为对应时区,否则时段匹配会出现偏差。规则需写入网站根目录.htaccess,且服务器已开启mod_rewrite模块才可生效。
完整规则代码
将以下代码放在.htaccess文件最顶部即可生效:
RewriteEngine On # 排除重定向目标页,避免无限重定向循环 RewriteCond %{REQUEST_URI} ^/weekend\.html$ [OR] RewriteCond %{REQUEST_URI} ^/we-are-closed-come-back-later\.html$ RewriteRule ^ - [L] # 周六、周日全天重定向至周末提示页 RewriteCond %{TIME_WDAY} ^0$ [OR] RewriteCond %{TIME_WDAY} ^6$ RewriteRule ^.*$ https://example.com/weekend.html [L,R=301] # 周一至周五18:00-次日7:00 重定向至站点首页 RewriteCond %{TIME_WDAY} ^[1-5]$ RewriteCond %{TIME_HOUR}%{TIME_MIN} >=1800 [OR] RewriteCond %{TIME_HOUR}%{TIME_MIN} <0700 RewriteRule ^.*$ https://example.com [L,R=301] # 周一至周五7:01-17:59 重定向至歇业提示页 RewriteCond %{TIME_WDAY} ^[1-5]$ RewriteRule ^.*$ https://example.com/we-are-closed-come-back-later.html [L,R=301]
逻辑说明
- 最上方的排除规则:访问请求如果已经是两个提示页本身,直接终止重写流程,不会触发后续跳转,避免死循环
- 周末规则优先级最高:只要识别到是周六/周日,直接匹配跳转,不再执行工作日时段判断
- 工作日跨天时段判断:将小时、分钟拼接为4位数字(如18:00为1800、06:59为0659、07:00为0700)做数值比较,比单独判断小时、分钟更简洁,边界时间准确率更高:大于等于1800对应18点及以后,小于0700对应7点整之前,正好覆盖18:00到次日7:00的完整区间
- 最后一条工作日规则:已经排除了周末、工作日18:00-次日7:00的场景,剩余的工作日时段自然就是7:01-17:59,无需额外写时间判断,减少匹配开销
原有测试规则的问题
- 仅匹配周日22点非00分的极窄场景,完全没有覆盖需求要求的星期、时段范围
- 未做重定向循环排除,跳转到目标页后会重复触发规则导致访问报错
- 规则没有按匹配优先级排序,容易出现逻辑冲突
- 时段判断逻辑零散,没有做区间化匹配,边界时间很容易判断错误
内容的提问来源于stack exchange,提问作者Ahmed Hosny
相关产品推荐
相关产品推荐

