2

我正在制作一个脚本,其中 php 将 fwrite 并将其广告在 </file> 标记之后,它不会被包含在内。主要目的是在此 .htaccess 文件中记录每个 IP,以便无法访问此特定文件。这是我的代码:(在 google 和 php.net 上搜索大约 3 个小时以上)。我曾想过是否有办法从文件 .htaccess 中读取“单词”</file> 所在的位置,然后再添加 $ip。或通过其他方式在 <file forum.php * 中获取 $badpersonip *(我不能使用数据库,因此需要仅通过 PHP 和 .htaccess 完成)

<?php

$badpersonip = $_SERVER['REMOTE_ADDR'];

echo "You have been banned $badpersonip , dont spam!! <br> ";
$ip = "deny from $badpersonip \n";
$banip = '.htaccess';
$fp = fopen($banip, "a");
$write = fputs($fp, $ip);

?>

这也是我的 .htaccess 代码:

<files forum.php>
Order Allow,Deny
Allow from all

deny from 127.0.2.1
deny from 127.1.2.1

</files>
deny from 127.0.0.3

如您所见,它会在文件标签关闭后在底部广告新 IP。:(

非常感谢您的帮助。

4

1 回答 1

3

如果不是使用fwrite()您将整个内容读入字符串中file_get_contents(),您可以轻松地str_replace()将现有的替换</files>为新行并</files>

// Read the while file into a string $htaccess
$htaccess = file_get_contents('.htaccess');
// Stick the new IP just before the closing </files>
$new_htaccess = str_replace('</files>', "deny from $badpersonip\n</files>", $htaccess);
// And write the new string back to the file
file_put_contents('.htaccess', $new_htaccess);

如果您希望文件变得非常大,则不建议这样做,但对于几十或几百个 IP,它应该可以正常工作。</files>如果您在该 .htaccess 文件中有多个文件,这将无法正常工作。这将需要更仔细的解析才能找到正确的结束标记。

如果保留空格(如果您之前有缩进</files>)对您很重要,您可以考虑使用preg_replace()代替更简单的str_replace().

另一种方法是使用file()将 .htaccess 读取到其行的数组中,找到包含行的行</files>并在它之前插入一个新的数组元素,然后将这些行重新连接在一起并将其写入文件。

于 2012-06-26T18:50:35.260 回答