如何检查文件中是否存在行

时间:2015-03-15 14:19:05

标签: php .htaccess

我想检查文件中是否存在一行,以便避免相同的行重复。我已经对网站设置了开发限制,只允许自己查看,其他人被重定向到“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地址。

我该怎么做?

1 个答案:

答案 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次加法将翻两番,等等。