RewriteCond 通过条件判断阻止非法请求触发重定向,防范开放重定向:校验 redirect_to 等参数是否为白名单域名、非空、非内网地址、合法路径;限制仅特定 URI 和 GET 方法启用;强制 HTTPS 与 Host 匹配;过滤危险字符;注意 %1 反向引用及 AND/OR 逻辑。

Apache 中 RewriteCond 本身不直接“过滤重定向请求”,而是配合 RewriteRule,在重定向执行前做条件判断,从而控制是否允许该重定向发生。关键不是拦截“重定向动作”,而是阻止非法请求触发重定向逻辑——比如防止恶意构造的跳转参数被滥用为开放重定向(Open Redirect)。
识别并拦截开放重定向风险参数
开放重定向常源于 URL 中携带未校验的 redirect_to、url、next 等参数,攻击者可借此跳转到钓鱼站点。RewriteCond 可在重定向规则前检查这些参数值是否合法:
- 拒绝非白名单域名的跳转目标:
RewriteCond %{QUERY_STRING} (?:^|&)redirect_to=([^&]+) [NC]
RewriteCond %1 !^(https?://(example\.com|app\.example\.com)|/)
RewriteRule ^ - [F] - 禁止空值、协议剥离或内网地址:
RewriteCond %{QUERY_STRING} (?:^|&)redirect_to=(?:$|[^&]*://(?:127\.0\.0\.1|10\.|192\.168\.|localhost)) [NC]
RewriteRule ^ - [F]
限制重定向触发路径与方法
并非所有路径都该支持重定向参数。可通过 RewriteCond 锁定仅允许特定接口启用跳转逻辑:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 只对登录成功页 /login/success 启用 redirect_to:
RewriteCond %{REQUEST_URI} ^/login/success$
RewriteCond %{QUERY_STRING} redirect_to=([^&]+)
RewriteCond %1 ^/.*$
RewriteRule ^(.*)$ /%1 [R=302,L] - 拒绝 POST 请求携带跳转参数(通常应仅用于 GET):
RewriteCond %{REQUEST_METHOD} =POST
RewriteCond %{QUERY_STRING} redirect_to=
RewriteRule ^ - [F]
结合 HTTPS 和 Host 头增强校验
开放重定向常伴随协议降级或 Host 头欺骗。RewriteCond 可叠加多层环境判断,提升防御强度:
- 强制跳转目标必须走 HTTPS,且 Host 匹配主站:
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} !^example\.com$ [NC]
RewriteCond %{QUERY_STRING} redirect_to=
RewriteRule ^ - [F] - 拦截含危险字符的跳转路径(如 //、javascript:、data:):
RewriteCond %{QUERY_STRING} (?:^|&)redirect_to=[^&]*(?://|:\/|javascript:|data:|vbscript:) [NC]
RewriteRule ^ - [F]
注意 RewriteCond 的执行顺序和变量引用
每条 RewriteCond 必须紧邻其对应的 RewriteRule 前;多个条件默认是 AND 关系,用 [OR] 显式声明 OR;反向引用用 %1(来自 RewriteCond 括号捕获),不能误写成 $1(那是 RewriteRule 的):
- 错误写法:
RewriteCond %{QUERY_STRING} redirect_to=([^&]+)
RewriteRule ^ /$1 [R,L] → 此处 $1 是空的,应为 %1 - 正确写法:
RewriteCond %{QUERY_STRING} redirect_to=([^&]+)
RewriteCond %1 ^/[^?#]+$
RewriteRule ^ /%1 [R=302,L]

















