子域名能用phpwaf防护吗_phpwaf子域名防护配置法【方法】

1次阅读

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

子域名能用phpwaf防护吗_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.comsql 检测但保留 prod.example.com 的),得手动加判断逻辑

如何让 phpwaf 区分子域名做策略?

原生 phpwaf 不提供「按 Host 分策略」的配置项,但你可以在 waf.phpconfig.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 生效。否则调半天规则,实际连第一行代码都没跑。

text=ZqhQzanResources