我想检查文件中是否存在一行,以便避免相同的行重复。我已经对网站设置了开发限制,只允许自己查看,其他人被重定向到“unavailable.php”页面但是我想允许人们查看网站,如果他们请求许可
在我的情况下,我有一个.htaccess
文件
Options +FollowSymlinks
RewriteEngine On
RewriteCond %{REMOTE_HOST} !^34\.120\.121\.20 #this a random ip
RewriteCond %{REQUEST_URI} !path/to/first/exception\.php$ #first exception is 'unavailable.php'
RewriteCond %{REQUEST_URI} !path/to/another/exception\.php$ #the second exception is 'request_permission.php'
RewriteRule \.php$ /redirect/to/first/exception/ [L]
在request_permission.php
中,我有以下代码:
<?php
$ip = $_SERVER['REMOTE_ADDR'];
$data = file('.htaccess');
$parts = explode(' ', $data[2]);
$parts_end = end($parts);
$parts_substred = substr($parts_end, 2);
$ip_addr = str_replace('\\', '', $parts_substred);
if ($ip_addr != $ip){
$new_ip = str_replace('.', '\\.', $_SERVER['REMOTE_ADDR']);
$new_string = str_replace($parts_end, "", $data[2]) . "!^".$new_ip;
$string = $data[0].$data[1].$data[2].$new_string.PHP_EOL.$data[3].$data[4].$data[5];
//file_put_contents(".htaccess", $string);
}
?>
现在,每当我访问request_permission.php
新行时,就会创建一个新行:RewriteCond %{REMOTE_HOST} !^56\.80\.1\.15
(假设这是我的IP)。
我想检查htaccess中是否存在具有我的IP地址的行,这样做我不会再次复制它。
<小时/> 我尝试使用strpos()
,但即使存在,也找不到我的IP地址。
我该怎么做?
答案 0 :(得分:2)
我只想在preg_match()
中使用正则表达式查找任何REMOTE_HOST行,然后在找不到所需的行时附加:
请注意,我完全同意其他人的意见,认为这不是一个好的解决方案。我正在回答这个问题,但同时建议您寻找其他方式......
我的原创(现已删除)有一些问题 - 这个有用,虽然仍然在做一些我认为你不应该做的事情(我只是为了方便而复制整个测试脚本 - 你需要回去阅读文件):
<?php
$ip = '34.120.121.29';
$ip_pat = str_replace('.', '\\\\\\.', $ip);
# Note that I'm using $data as a straight string, not an array - use file_get_contents() to read it
$data = <<<EOF
Options +FollowSymlinks
RewriteEngine On
RewriteCond %{REMOTE_HOST} !^34\.120\.121\.20 #this a random ip
RewriteCond %{REQUEST_URI} !path/to/first/exception\.php$ #first exception is 'unavailable.php'
RewriteCond %{REQUEST_URI} !path/to/another/exception\.php$ #the second exception is 'request_permission.php'
RewriteRule \.php$ /redirect/to/first/exception/ [L]
EOF;
$pat = '^RewriteCond *%{REMOTE_HOST} *';
if (!preg_match("/$pat.*$ip_pat/m", $data)) {
#echo "NO MATCH<br />\n";
$new_ip = str_replace('.', '\\.', $ip);
$new_string = preg_replace("/$pat/m", "RewriteCond %{REMOTE_HOST} !^$new_ip".PHP_EOL."$0", $data);
#$data .= $new_string.PHP_EOL;
echo nl2br("$new_string");
}
请注意,在limit
调用中使用preg_replace()
参数仅替换第一次出现。如果你不这样做那么你的第3次加法将加倍,你的第4次加法将翻两番,等等。