DirectoryIndex 本身不支持按时间动态切换首页,只能静态匹配文件名;真正可行方案是用 mod_rewrite 根据 %{TIME_HOUR} 变量重写根路径请求,或通过 PHP 在 index.php 中动态包含不同时段模板。

Apache 的 DirectoryIndex 指令本身不支持动态逻辑(如按时间切换首页),它只做静态文件名顺序匹配,无法直接结合时段条件。mod_map 也不是 Apache 官方模块——Apache 没有名为 mod_map 的标准模块,可能是对 mod_rewrite、mod_macro 或第三方模块的误称。
真正能实现“基于时段切换首页”的方案,是用 mod_rewrite + 环境变量 + DirectoryIndex 配合,或更稳妥地用 mod_rewrite 直接内部重写请求路径。下面分两种实用方式说明:
DirectoryIndex 本身不能按时间生效,但可间接配合
DirectoryIndex 只负责当用户访问目录(如 /)时,按固定顺序找 index.html、index.php 等文件。它不读取时间、不执行判断。所以不能写成:
# ❌ 错误示例:DirectoryIndex 不支持条件语法
DirectoryIndex %{TIME_HOUR} < 12 ? index.morning.html : index.evening.html但它可以和 mod_rewrite 协同工作:
先用 RewriteRule 根据当前小时设置一个环境变量或重写到对应文件,再让 DirectoryIndex 起作用 —— 实际上更常用的是跳过 DirectoryIndex,直接重写 URL 到目标文件。
用 mod_rewrite 实现时段首页切换(推荐)
确保启用了 mod_rewrite(绝大多数 Apache 默认启用):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
# 启用重写引擎(通常在虚拟主机或 .htaccess 中)
RewriteEngine On
# 获取当前小时(00–23),存入环境变量 HOUR
RewriteCond %{TIME_HOUR} ^0[6-9]$ # 06–09点 → morning
RewriteRule ^/?$ /index.morning.html [L]
RewriteCond %{TIME_HOUR} ^1[0-7]$ # 10–17点 → day
RewriteRule ^/?$ /index.day.html [L]
RewriteCond %{TIME_HOUR} ^1[8-9]$ # 18–19点 → evening
RewriteRule ^/?$ /index.evening.html [L]
RewriteCond %{TIME_HOUR} ^2[0-3]$ # 20–23点 → night
RewriteRule ^/?$ /index.night.html [L]
RewriteCond %{TIME_HOUR} ^0[0-5]$ # 00–05点 → late-night
RewriteRule ^/?$ /index.late.html [L]- 所有规则匹配根路径
^/?$(即访问/或http://site/); -
%{TIME_HOUR}是 Apache 内置变量,返回两位数字格式(如07,14,22); -
[L]表示匹配后停止后续规则; - 文件需真实存在于文档根目录(如
/var/www/html/index.morning.html); - 不依赖
DirectoryIndex,而是显式重写请求目标,更可靠可控。
如果坚持用 DirectoryIndex 配合(不推荐但可行)
可借助 mod_env 和 mod_rewrite 动态设置 DirectoryIndex 值 —— 但 Apache 不允许运行时修改 DirectoryIndex,只能通过 .htaccess 或配置段静态定义。因此唯一变通法是:
- 准备多个
.htaccess文件(如day.htaccess,night.htaccess); - 用 cron 每小时切换软链接:
# 每小时执行一次 ln -sf /var/www/html/day.htaccess /var/www/html/.htaccess
- 对应
.htaccess中写:DirectoryIndex index.day.html index.html
或
DirectoryIndex index.night.html index.html
⚠️ 缺点明显:需系统权限、存在竞态风险、切换延迟、不实时,仅适合低频变动场景。
注意事项
- 时间基于服务器本地时区(由
TZ环境变量或系统设置决定),务必确认date命令输出与预期一致; - 浏览器缓存可能影响测试效果,建议用
curl -I http://localhost/查看Location或实际响应内容; - 若使用 PHP,也可在
index.php中判断date('H')后include()不同模板,更灵活且无需改 Apache 配置。
不复杂但容易忽略:mod_rewrite 规则顺序很重要,时间范围别重叠或遗漏(比如漏掉 05 就会 fallback 到默认行为)。

















