frankenphp 1.4 的 ip 黑名单必须通过 caddy 的 ip_match 指令在 caddyfile 中配置,并配合系统防火墙实现;php 层判断无效且不安全。

FrankenPHP 1.4 本身不内置 IP 黑名单功能,它基于 Caddy 作为 Web 服务器,因此 IP 访问控制必须通过 Caddy 的访问规则实现,而非 PHP 层逻辑。直接在 PHP 脚本里用 $_SERVER['REMOTE_ADDR'] 判断后 exit 是无效防护——请求已进入应用层,可能触发日志、数据库查询等副作用,且无法拦截恶意扫描或预检请求。
以下是在 FrankenPHP 1.4 环境中真正生效的 IP 黑名单配置方式:
在 Caddyfile 中使用 handle + ip_match 拦截黑名单 IP
Caddy 2.7+(FrankenPHP 1.4 默认集成)支持 ip_match 指令,可精准匹配单个 IP 或 CIDR 段,并返回 403。推荐在 route 或 handle 块最前端执行,确保优先于 PHP 处理:
localhost:8080 {
# 定义黑名单 IP 列表(支持 IPv4/IPv6)
@blacklisted ip_match {
203.0.113.5
192.168.100.0/24
2001:db8::/32
}
# 匹配即拒绝,返回 403
handle @blacklisted {
respond "Forbidden" 403
}
# 后续正常处理 PHP 请求
php_server
}
⚠️ 注意:ip_match 是 Caddy 原生命令,无需额外模块;但必须写在 php_server 之前,否则请求已被转发至 PHP,拦截失效。
配合防火墙做系统级封禁(更彻底)
Caddy 层拦截仍会建立 TCP 连接,对高频恶意请求建议叠加操作系统防火墙:
-
Linux(iptables):
iptables -A INPUT -s 203.0.113.5 -p tcp --dport 8080 -j DROP iptables -A INPUT -s 192.168.100.0/24 -p tcp --dport 8080 -j DROP
-
Linux(firewalld,CentOS/RHEL 7+):
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.5" reject' firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.100.0/24" reject' firewall-cmd --reload
该方式在内核层丢包,零资源消耗,适合应对 DDoS 或爬虫扫段。
不推荐的错误做法
在 PHP 脚本开头写
if (in_array($_SERVER['REMOTE_ADDR'], $blacklist)) die('403')
→ 请求已抵达 PHP,无法防爆破、浪费资源、绕过缓存。仅靠 MySQL 用户权限删账号来“限 IP”
→ 与 FrankenPHP Web 访问无关,只影响数据库连接。使用
header('HTTP/1.0 403 Forbidden')+exit
→ HTTP 状态头已发送,但响应体仍生成,且无法阻止 OPTIONS 预检等非 PHP 路由请求。
Caddy 的 ip_match + 系统防火墙组合,才是 FrankPHP 1.4 下安全、高效、可维护的 IP 黑名单方案。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











