apache mod_rewrite加固核心是限制其能力而非禁用:①主配置设allowoverride none,仅需目录显式启用fileinfo/indexes;②禁用inherit;③重定向须白名单校验域名;④前置过滤敏感路径与遍历字符;⑤重写后校验文件存在性;⑥临时启用rewrite:trace3日志审计。

Apache mod_rewrite 本身不是安全模块,但配置不当会引入严重风险——比如开放任意重定向、泄露敏感路径、绕过认证或触发 SSRF。加固重点不在“开启 mod_rewrite”,而在“限制它能做什么”。
关闭不必要的重写能力
很多站点只在特定目录用重写,却全局启用 AllowOverride All,这等于把 URL 控制权交给了所有 .htaccess 文件。
- 在主配置中,将 AllowOverride All 改为 AllowOverride None,仅在真正需要的目录下显式启用部分指令
- 如必须用 .htaccess,只放开必要指令:AllowOverride FileInfo Indexes(禁用 AuthConfig、Limit、Options 等)
- 禁用 RewriteOptions Inherit 或 InheritDown,防止子目录意外继承上级规则
堵住重定向类漏洞
常见攻击是构造恶意 Referer 或 Query String,触发无校验的外部跳转(如 ?redir=http://evil.com)。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 避免直接使用 %{QUERY_STRING} 或 %{HTTP_REFERER} 做重定向目标,除非经过白名单校验
- 若需动态跳转,用 RewriteCond 配合正则严格限定域名:RewriteCond %{QUERY_STRING} ^redir=(https?://(example\.com|cdn\.example\.com)/.*)$ [NC]
- 对外部跳转统一加 [R=301,L,NE],并确保 NE 标志防止 URL 编码被二次解析
防止路径遍历与敏感文件暴露
重写规则若未过滤点号、斜杠或空字节,可能被用于访问 .git、.env、/etc/passwd 等。
- 所有 RewriteRule 前加前置校验:RewriteCond %{REQUEST_URI} !^/(\.git|\.env|\.htaccess|config\.php) [NC]
- 禁止双斜杠、点号连续出现:RewriteCond %{REQUEST_URI} \.\.|\.\./|// [OR]
- 对重写后的目标路径做存在性检查:RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d,再执行重写,否则返回 404
启用重写日志辅助审计
生产环境不建议长期开 trace8,但上线前或排查可疑行为时,可临时启用精细日志定位问题规则。
- 在虚拟主机或全局配置中添加:LogLevel alert rewrite:trace3
- 日志会记录每条规则匹配过程、条件判断结果、最终替换路径,便于发现宽泛正则或逻辑漏洞
- 配合 grep -i "rewrite" /var/log/httpd/error_log 快速筛查异常重写行为










