.htaccess中如何对比当前时间与DEADLINE环境变量实现重定向
Apache mod_rewrite 直接引用环境变量做时间对比实现方案
核心注意事项
原生Apache Rewrite规则完全支持直接读取环境变量做对比,不需要硬编码时间,但是要避开两个常见问题:
SetEnv指令属于mod_env模块,执行时机晚于mod_rewrite的重写阶段,重写规则运行时还读不到这个变量,必须换用更早执行的变量赋值方式- 两边对比的时间字符串格式必须完全对齐,因为RewriteCond的字符串对比是字典序匹配,你当前用的
日/月/年_小时h分钟格式是高位时间在前、固定长度的结构,字典序对比结果和实际时间先后逻辑完全一致,不需要额外转时间戳
可用配置
第一种写法(兼容PHP读取变量最方便):
RewriteEngine On # 用SetEnvIf提前注入环境变量,重写阶段可读取,PHP端可通过$_SERVER['DEADLINE']直接获取值 SetEnvIf Request_URI "^.*$" DEADLINE=16/06/2022_19h30 # 拼接当前时间字符串,和环境变量存储的截止时间做对比 RewriteCond %{TIME_DAY}/%{TIME_MON}/%{TIME_YEAR}_%{TIME_HOUR}h%{TIME_MIN} >=%{ENV:DEADLINE} RewriteRule ^index.php$ read_only/index.html [L]
第二种写法(不需要依赖mod_setenvif模块,纯mod_rewrite实现):
RewriteEngine On # 重写流程开头先赋值环境变量,PHP端同样可读取 RewriteRule .* - [E=DEADLINE:16/06/2022_19h30] RewriteCond %{TIME_DAY}/%{TIME_MON}/%{TIME_YEAR}_%{TIME_HOUR}h%{TIME_MIN} >=%{ENV:DEADLINE} RewriteRule ^index.php$ read_only/index.html [L]
格式校验要求
配置截止时间时必须保证每个时间段都是两位数字:
- 月份、日期小于10时前面补0,比如6月要写
06不能写6 - 小时、分钟小于10时前面补0,比如9点5分要写
09h05不能写9h5
否则字符串长度不一致会导致字典序对比结果错误。
内容的提问来源于stack exchange,提问作者Etlok
相关产品推荐
相关产品推荐

