如何从 htaccess PHP 的 IP 中提取 deny?

How do I extract deny from IP from htaccess PHP?

我正在尝试列出在我的 htaccess 中列出的要被拒绝的 IP。我不想看到 deny from allallow from.

示例 IP 列表:

<files .htaccess>
order allow,deny
deny from all
</files>

allow from 10.10.190.187
deny from 10.10.76.194
deny from 10.10.85.70
deny from 10.10.63.174
deny from 10.10.56.77
deny from 10.10.15.196

期望的输出:

deny from 10.10.76.194
deny from 10.10.85.70
deny from 10.10.63.174
deny from 10.10.56.77
deny from 10.10.15.196

注意 allow from 10.10.190.187deny from all 被排除在所需的输出之外。

我当前的代码:

$htaccess = $_SERVER["DOCUMENT_ROOT"]."/.htaccess";
$file = $htaccess;
$contents = file_get_contents($file);
$lines = explode("\n", $contents); // this is your array of words
foreach($lines as $line) {
   if (preg_match('/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/', $line, $ip_match)) {
   $ip =  $ip_match[0];
}
$pattern = "/deny from $ip/";
   if (preg_match_all($pattern, $line, $ip_denymatch)) {
      foreach($ip_denymatch[0] as $ipL){
         echo $ipL . "<br>"; 
   }
  }  
}

当前输出样本为:

deny from
deny from 10.10.76.194
deny from 10.10.85.70
deny from 10.10.63.174
deny from 10.10.56.77
deny from 10.10.15.196

输出包括 deny from all.

当您阅读行:deny from all 时,第一个 preg_match return 为假,$ip 为空。

然后当您用 $pattern = "/deny from $ip/"; 调用 preg_match_all 时,该行匹配。

您应该使用单个 preg_match,例如:

foreach($lines as $line) {
    if (preg_match('/^deny from \d{1,3}(?:\.\d{1,3}){3}$/', $line)) {
        echo $line,"\n";
    }
}

file函数易于使用,可以将文件逐行读取到数组中。

$lines = file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

preg_grep 适用于使用正则表达式过滤数组。

$arrDeniedIps = preg_grep('/^deny from [0-9.]+/',$lines);