2015-03-15 7 views
0

Я хочу проверить, существует ли строка в файле, чтобы избежать повторения одной строки. Я установил ограничение на сайт, чтобы позволить себе просматривать его, другие перенаправляются на страницу «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).

Я хочу проверить, существует ли линия с моим IP-адресом в htaccess, сделайте это, я не буду дублировать ее снова.


Я пытался использовать strpos(), но он не находит мой IP-адрес, даже если он существует.

Как мне это сделать?

+0

Что-то вроде этого? http://stackoverflow.com/questions/19760564/php-find-a-string-in-file-then-show-its-line-number – bloodyKnuckles

+2

Вы используете неправильный подход. Не изменяйте файл стиля .htaccess' для этого. Вместо этого взгляните на документацию: для этого есть доступ к базе данных в фоновом режиме. Гораздо удобнее, меньше подвержено ошибкам, проще. – arkascha

+0

humm, то как я могу разрешить этот IP-адрес, если я не изменяю файл '.htaccess'? –

ответ

2

Я бы просто посмотреть на любой REMOTE_HOST линии с использованием регулярных выражений в preg_match() и затем добавить нужную строку, если он не найден:

Обратите внимание, что я полностью согласен с мнением других людей, что это не очень хорошая решение. Я отвечаю на вопрос, но рекомендую в то же время, что вы ищете какой-то альтернативный способ ...

У моего оригинала (теперь удалено) были проблемы: этот работает, хотя и все еще что-то делает, я не думаю, что вы должны делать (я просто скопировать в целом тестовый скрипт для простоты - вам придется вернуться к чтению файла):

<?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-е дополнение будет удвоено, а ваше четвертое добавление будет увеличено в четыре раза и так далее.

+0

@arkascha, пожалуйста, перечитайте мой параграф оценки. Я сказал, что согласен с другими, что это не * (выделено мной) хорошая идея и что OP ищет какой-то альтернативный способ. –

+0

этот фрагмент дает мне ошибку, что 'preg match запрашивает не менее 2 параметров, 1 задано', где вы искали это:'/RewriteCond *% \ {REMOTE_HOST \} *!^'. $ Ip_pat.'/'' ? –

+0

Посмотрите на часть ниже, где я ее отредактировал. Добавление дополнительного аргумента в preg_match было всего лишь одним необходимым изменением ... –

Смежные вопросы