如何从 htaccess PHP 的 IP 中提取 deny?
How do I extract deny from IP from htaccess PHP?
我正在尝试列出在我的 htaccess 中列出的要被拒绝的 IP。我不想看到 deny from all
或 allow 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.187
和 deny 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);
我正在尝试列出在我的 htaccess 中列出的要被拒绝的 IP。我不想看到 deny from all
或 allow 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.187
和 deny 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);