phpEnv本身不提供白名单功能,需通过Nginx/Apache配置或PHP代码层组合实现:Nginx方式在vhost配置中添加allow/deny指令,高效拦截;PHP层需在入口文件顶部校验真实IP(兼容代理)并支持CIDR匹配,且必须早于框架初始化执行。

phpEnv 本身不提供白名单功能,得靠 Nginx/Apache + PHP 代码组合实现
phpEnv 是一个 Windows 下的 PHP 集成环境(类似 XAMPP),它默认不内置 IP 或域名白名单模块。所谓“在 phpEnv 里设白名单”,实际是修改它所托管的 Web 服务器(通常是 Nginx 或 Apache)配置,或在 PHP 应用层加判断。直接改 phpEnv 界面或主配置文件无效。
在 phpEnv 的 Nginx 配置中加 IP 白名单(推荐)
这是最轻量、最高效的方式——请求根本不会进 PHP,Nginx 在入口就拦截。适用于固定办公 IP、测试机等场景。
- 打开 phpEnv 安装目录 →
servers\nginx\conf\vhost\,找到你站点对应的.conf文件(如default.conf) - 在
server块内、location ~ \.php$上方插入:
allow 192.168.1.100; allow 203.0.113.0/24; deny all;
注意:必须把 deny all 放在最后,且不能写在 location 内部(否则只对 PHP 路径生效,静态资源仍可访问)
- 保存后,在 phpEnv 主界面点击【重载 Nginx】,不要重启整个服务
- 验证方式:换一台不在白名单里的机器访问,应直接返回
403 Forbidden,且 PHP 错误日志里不会出现记录
PHP 层手动校验 IP 白名单(兼容性高,但有性能损耗)
适合需要动态读取数据库白名单、或 phpEnv 启用了反向代理(如前端套了 Cloudflare)导致 $_SERVER['REMOTE_ADDR'] 不准的情况。
立即学习“PHP免费学习笔记(深入)”;
- 在入口文件(如
index.php顶部)加校验逻辑,别放在框架路由之后 - 先获取真实 IP(不能只信
$_SERVER['REMOTE_ADDR']):
function getRealIp() {
if (!empty($_SERVER['HTTP_X_REAL_IP'])) {
return $_SERVER['HTTP_X_REAL_IP'];
}
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
return trim($ips[0]);
}
return $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';
}- 再比对白名单(支持 CIDR):
$whitelist = ['127.0.0.1', '192.168.5.0/24'];
$ip = getRealIp();
<p>$allowed = false;
foreach ($whitelist as $rule) {
if (strpos($rule, '/') !== false) {
[$subnet, $bits] = explode('/', $rule);
$ip_long = ip2long($ip);
$subnet_long = ip2long($subnet);
$mask = -1 << (32 - $bits);
if (($ip_long & $mask) === ($subnet_long & $mask)) {
$allowed = true;
break;
}
} elseif ($ip === $rule) {
$allowed = true;
break;
}
}</p><p>if (!$allowed) {
http_response_code(403);
die('Access denied');
}关键点:这个逻辑必须在任何业务代码、框架初始化、路由分发之前执行;否则攻击者可能绕过校验直达敏感接口。
域名白名单要防 Host 头伪造,不能只比对 $_SERVER['HTTP_HOST']
phpEnv 默认不校验 Host 头,但如果你用它跑多站点或 API,就得防恶意请求伪造 Host: evil.com 导致路由错乱或缓存污染。
- 白名单数组必须用小写统一处理:
$allowed = ['api.example.com', 'admin.example.org']; - 取值时强制小写:
$host = strtolower($_SERVER['HTTP_HOST'] ?? ''); - 必须用严格比较:
in_array($host, $allowed, true),避免'example.com.'(带点)意外匹配 - 如果 nginx 已配
server_name,PHP 层这步可省;但若 nginx 泛解析(如server_name _;),就必须在 PHP 中补上
容易被忽略的是:当 phpEnv 启用 HTTPS 时,$_SERVER['HTTPS'] 可能为空或 off,此时仅靠 HTTP_HOST 不足以识别协议切换,需结合 $_SERVER['SERVER_PORT'] 判断。



















