如何使用PHP从.htaccess中提取指定deny from IP条目
问题根因
你的现有代码存在两个逻辑漏洞:
- $ip变量没有在每次循环前重置,遇到不含IP的行(比如
deny from all)时,会沿用上次循环的$ip值,甚至首次循环未匹配到IP时$ip为空,导致匹配到无IP的deny from内容输出 - 分两次匹配的逻辑冗余,容易出现变量作用域的问题
修正后代码
$htaccess = $_SERVER["DOCUMENT_ROOT"]."/.htaccess"; $contents = file_get_contents($htaccess); $lines = explode("\n", $contents); foreach ($lines as $line) { // 单次正则直接匹配符合要求的 deny IP 规则 if (preg_match('/^deny from (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/', trim($line), $matches)) { echo $matches[0] . "<br>"; } }
规则说明
新的匹配规则直接过滤无效内容:
^匹配行开头,排除行内嵌套的无关内容- 固定匹配
deny from前缀,自动过滤所有allow from开头的规则 - 紧跟IPv4地址匹配规则,直接排除后缀为
all的情况 $匹配行结尾,避免行尾多余字符干扰匹配- 增加
trim()处理行首尾的空格、换行符,兼容.htaccess的不规则缩进格式
内容的提问来源于stack exchange,提问作者CharlieT
相关产品推荐
相关产品推荐

