虚拟主机本身不支持定时开关网站,需借助系统级定时任务(如cron)配合web服务管理实现:可通过a2ensite/a2dissite切换apache站点配置并重载服务,或在apache中用require expr按时间控制访问权限,nginx则可用map+if实现类似逻辑。
虚拟主机本身不支持“定时开启/关闭网站访问”这种行为——它只是 apache 或 nginx 的配置机制,用于区分多个域名或 ip 的请求路由。真正能实现“定时控制访问”的,是结合系统级定时任务(如 cron)与 web 服务管理(如 systemctl、a2ensite/a2dissite 或配置重载)来动态启用或禁用站点。
核心思路:用定时任务切换站点状态
不是让虚拟主机“自己定时开关”,而是通过脚本在指定时间执行以下操作:
- 启用某站点配置(例如把 /etc/apache2/sites-available/mysite.conf 符号链接到 sites-enabled/),再重载 Apache
- 禁用某站点(移除符号链接或改名配置文件),再重载服务
- 或更轻量:用 mod_rewrite 或 mod_authz_host 在配置中嵌入时间判断逻辑(仅限 Apache)
方法一:cron + a2ensite/a2dissite(推荐,清晰可靠)
适用于 Debian/Ubuntu 系统上的 Apache。
步骤如下:
- 确保站点已配置好但未启用:sudo a2dissite mysite.conf
- 写一个启用脚本 /opt/toggle-site-on.sh:
sudo a2ensite mysite.conf &> /dev/null
sudo systemctl reload apache2
- 写一个禁用脚本 /opt/toggle-site-off.sh:
sudo a2dissite mysite.conf &> /dev/null
sudo systemctl reload apache2
- 赋予执行权限:chmod +x /opt/toggle-site-*.sh
- 编辑 root 的 crontab:sudo crontab -e
- 添加两行(例如每天 8:00 启用、22:00 禁用):
0 22 * * * /opt/toggle-site-off.sh
方法二:Apache 内置时间条件控制(无需重启服务)
在虚拟主机配置的
Require expr %{TIME_HOUR} >= 8 && %{TIME_HOUR}
这样,每天 8:00–21:59 允许访问,其余时间返回 403 Forbidden。无需 reload,修改后保存即生效(需 Apache ≥ 2.4)。
注意:TIME_HOUR 是 UTC 时间,若服务器时区非 UTC,需先确认 systemctl show --property=Timezone,必要时用 SetEnv TZ Asia/Shanghai 配合 mod_env 调整。
方法三:Nginx 场景下用 map + if(谨慎使用)
Nginx 没有原生时间判断指令,但可通过 map 构建时间变量,再用 if 控制响应:
map $time_iso8601 $allow_access {default 0;
"~^....-..-..T0[89]|1[0-9]|2[01]" 1;
}
server {
location / {
if ($allow_access = 0) { return 403; }
root /var/www/mysite;
}
}
该规则允许每天 08:00–21:59 访问(基于 ISO 时间字符串匹配)。注意:if 在 location 外不推荐,且不能嵌套,务必测试后再上线。










