在 apache 的 rewritecond 中,多个条件默认就是逻辑与(and)关系。只要在同一组 rewriterule 前连续声明多个 rewritecond,且不使用任何修饰符,apache 会依次检查这些条件,只有当所有条件都匹配成功时,后面的规则才会执行。

如何验证用户是否来自特定 IP 且使用 Chrome 浏览器
要判断用户 IP 是否为 192.168.1.100 且浏览器包含 Chrome,只需将两个 RewriteCond 连续书写即可。第一个条件检查 %{REMOTE_ADDR},第二个条件检查 %{HTTP_USER_AGENT}。这种写法确保了只有同时满足这两个特征的请求才会被处理。

<virtualhost>
ServerName example.com
DocumentRoot /var/www/html
RewriteEngine On
# 条件1: IP 必须是 192.168.1.100
RewriteCond %{REMOTE_ADDR} ^192\.168\.1\.100$
# 条件2: User-Agent 必须包含 Chrome
RewriteCond %{HTTP_USER_AGENT} Chrome
# 仅当上述两个条件同时满足时执行
RewriteRule ^/admin$ /internal_admin.html [L]
</virtualhost>
预期结果:
- 请求来源 IP 192.168.1.100 且 UA 含 Chrome:返回 /internal_admin.html。
- 请求来源 IP 192.168.1.100 但 UA 不含 Chrome:不匹配,继续处理后续规则或返回默认内容。
- 请求来源 IP 不是 192.168.1.100 且 UA 含 Chrome:不匹配,因为第一个条件失败。
如何排除特定路径并限制访问时间段
如果需要实现更复杂的业务逻辑,例如“非 /api 开头的路径”且“当前时间在 9:00 到 18:00 之间”,同样可以通过连续添加 RewriteCond 来实现。这里需要注意正则表达式的取反逻辑以及时间变量的格式。通过组合 -f 文件存在性检查或字符串匹配,可以构建出精确的控制流。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。

<virtualhost>
ServerName example.com
DocumentRoot /var/www/html
RewriteEngine On
# 条件1: 请求 URI 不以 /api 开头
RewriteCond %{REQUEST_URI} !^/api
# 条件2: 当前小时数在 9 到 17 之间 (即 9:00-17:59)
RewriteCond %{TIME_HOUR} >=09
RewriteCond %{TIME_HOUR} </virtualhost>
预期结果:
- 请求 /index.html,时间为 10:00:匹配所有条件,重定向至 /business_hours/index.html。
- 请求 /api/data,时间为 10:00:第一个条件失败(以 /api 开头),不执行重定向。
- 请求 /index.html,时间为 20:00:第三个条件失败(小时数大于17),不执行重定向。
当 RewriteCond 中的变量为空时会发生什么
如果 RewriteCond 中引用的服务器变量(如 %{HTTP_HOST} 或自定义变量)为空字符串,默认的匹配行为取决于使用的测试操作符。如果使用 = 或 ~ 等运算符,空字符串通常会导致匹配失败,除非模式本身也允许空值。特别地,如果不指定任何操作符而直接写 RewriteCond %{VAR} pattern,它等价于 RewriteCond %{VAR} ~ pattern。若 pattern 不能匹配空串,则条件失败。这在实际调试中常被忽略,导致规则意外失效。
,










