phpwaf默认支持子域名防护,无需为每个子域名单独安装,但需确保所有子域名指向同一php入口文件,并在waf.php或config.php中通过$_server['http_host']手动区分策略;若子域名被web服务器提前拦截,则phpwaf无法生效。

phpwaf 默认支持子域名防护,但不会自动识别或区分子域名逻辑——它按 HTTP 请求的 $_SERVER['HTTP_HOST'] 或 $_SERVER['REQUEST_URI'] 做规则匹配,只要请求能到达你的 PHP 入口文件(如 index.php),就能生效。
子域名是否需要单独配置?
不需要为每个子域名单独安装或编译 phpwaf,但需注意以下三点:
- 所有子域名必须指向同一套 PHP 项目(或至少共用同一个入口文件),否则
require_once 'waf.php'不会被执行 - 若子域名由不同虚拟主机(vhost)或不同目录托管(例如
api.example.com指向/var/www/api,而www.example.com指向/var/www/web),则需在每个入口文件中显式引入waf.php -
config.php中的白名单、日志路径、规则开关等是全局生效的;如需差异化策略(比如禁止test.example.com的 SQL 检测但保留prod.example.com的),得手动加判断逻辑
如何让 phpwaf 区分子域名做策略?
原生 phpwaf 不提供「按 Host 分策略」的配置项,但你可以在 waf.php 或 config.php 中插入轻量判断:
if (isset($_SERVER['HTTP_HOST'])) {
$host = $_SERVER['HTTP_HOST'];
if (strpos($host, 'test.') === 0) {
$config['enable_sql_injection'] = false;
$config['log_path'] = '/var/log/phpwaf-test.log';
} elseif (strpos($host, 'admin.') === 0) {
$config['enable_rce'] = true;
}
}这种写法不依赖扩展,纯 PHP 层控制,兼容所有部署方式(包括共享主机)。注意:别在 config.php 里直接用 $_SERVER,某些环境(如 CLI)可能未定义,建议封装到初始化函数中。
立即学习“PHP免费学习笔记(深入)”;
常见踩坑点:子域名 403 却没日志?
这是最常被忽略的问题:子域名请求可能被 Web 服务器(Nginx/Apache)提前拦截,根本没进 PHP —— 所以 phpwaf 完全无感知。
- 检查 Nginx 配置是否漏了
include通用规则,导致子域名 vhost 没加载fastcgi_params,$_SERVER['HTTP_HOST']为空 - 确认子域名的 root 目录下确实有
waf.php和可读的config.php,且 PHP 有权限写入日志路径(chown www-data:www-data /var/log/phpwaf.log) - 如果用了 CDN 或反向代理,
HTTP_HOST可能被改写,需在waf.php开头加error_log("Host: " . ($_SERVER['HTTP_HOST'] ?? 'MISSING'), 3, '/tmp/waf-debug.log');快速验证
子域名防护本身不难,难点在于流量是否真进了 PHP 层。先确认请求路径完整走通(从 DNS → 代理 → Web 服务器 → PHP 解释器),再谈 phpwaf 生效。否则调半天规则,实际连第一行代码都没跑。











