如何让多目录PHP文件共享block_this.txt实现IP拦截与重定向?
解决IP拦截脚本的多目录适配与重复维护问题
针对你遇到的黑名单文件多目录重复上传、重定向地址适配问题,直接给你修改后的方案和代码:
1. 统一黑名单文件路径
把block_this.txt放到网站根目录(比如public_html或www),用网站根目录绝对路径读取文件,这样所有目录下的PHP文件调用函数时,都会读取同一个文件,一次更新全站点生效,不用重复上传。
PHP里可以用$_SERVER['DOCUMENT_ROOT']获取网站根目录的绝对路径,拼接成黑名单文件的完整路径。
2. 优化重定向地址(可选)
如果重定向到站内页面,用根目录绝对路径写法(比如/blocked.html),避免相对路径的适配问题;如果是外部地址,直接写固定URL即可。
3. 优化后的完整代码(含精确匹配+性能提升)
原代码的正则匹配可能出现部分IP误匹配(比如黑名单192.168.1.1会误匹配192.168.1.10),同时每次调用都读文件会影响性能,这里一并优化:
function smeblock($a) { // 用静态变量缓存黑名单内容,避免重复读取文件 static $blockedIps = null; if ($blockedIps === null) { // 读取根目录下的黑名单文件,可根据实际存放路径调整 $filePath = $_SERVER['DOCUMENT_ROOT'] . '/block_this.txt'; if (!file_exists($filePath)) { // 文件不存在时直接返回,避免报错 return; } $temps = file_get_contents($filePath); // 分割黑名单并过滤空行、空格 $blockedIps = array_filter(array_map('trim', explode('|', $temps))); } // 精确匹配IP,避免部分匹配错误 if (in_array(trim($a), $blockedIps, true)) { // 重定向到站内拦截页示例(根目录下的blocked.html) // header('Location: /blocked.html'); // 或重定向到外部地址 header('Location: https://www.google.com'); die(); } }
关键改动说明
- 绝对路径读取:
$_SERVER['DOCUMENT_ROOT']确保所有目录的PHP都指向同一个黑名单文件,彻底解决重复维护问题。 - 静态缓存:仅第一次调用函数时读取文件,后续直接用缓存的IP列表,大幅提升性能。
- 精确匹配:用
in_array严格匹配IP,比原正则更高效,避免部分IP误拦截。 - 容错处理:增加文件存在判断,避免文件缺失时触发PHP错误。
内容的提问来源于stack exchange,提问作者taigi
相关产品推荐
相关产品推荐

