2

phpがfwriteし、</ file>タグの後にアドバタイズするスクリプトを作成していますが、含まれていません。主な目的は、この特定のファイルにアクセスできないようにするために、この.htaccessファイルに各IPを記録することです。これが私のコードです:(google&php.netで約3時間以上検索しています)。「単語」</file>があるファイル.htaccessから読み取る方法があり、その前に$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 に答える