2010-11-18 2 views
0

У меня есть сценарий, который на некоторых событиях блокирует someones ip через htaccess deny from. Это код:Редактирование htaccess через php

file_put_contents('.htaccess', 'deny from ' . $_SERVER['REMOTE_ADDR'] . "\n", FILE_APPEND); 

Но что я хочу, а не спосо отрицать от этого пользователя может я иметь его перенаправить пользователя на другую страницу.

Я могу сделать это с помощью:

Options +FollowSymlinks 
RewriteEngine on 
RewriteCond %{REMOTE_HOST} !^123\.45\.67\.89 
RewriteRule \.html$ /alternate_page.html [R=302,L] 

Но можно ли это сделать без открытия HTAccess и добавления к нему. Вместо этого используйте функцию the file_put_contents

Спасибо большое.

+0

Независимо от того, что вы делаете, убедитесь, что вы синхронизируете несколько сценариев, которые могут пытаться сделать это одновременно, поэтому вы не завершаетесь поврежденным файлом '.htaccess' и не вызываете ошибок HTTP 500 на всех. – cdhowie

+0

как это сделать – DonJuma

ответ

0

Я бы рекомендовал хранить IP-адреса, которые вы не хотите разрешать в базе данных. Это делает администрирование, и если вы хотите получить статистику, они также могут быть легко добавлены (т. Е. Сколько раз этот пользователь пытался получить доступ к сайту после отказа, etd). Вы даже можете отправить определенные IP-адреса в другое место, если хотите.

  • Храните IP-адреса в таблице базы данных
  • Когда пользователь заходит на страницу проверки, чтобы увидеть, если их IP в таблице
  • Если так увеличиваем статистика счетчик (при желании) и перенаправить пользователя новое место
  • Или продолжить загрузку текущей страницы

Использование РНР Header functionHeader('Location: [url here]'); перенаправить их и помните, что это должно быть, прежде чем любое другое содержимое отправляется на страницу.

0

Что вы можете сделать, это ваш файл .htaccess, как это:

Options +FollowSymLinks 
RewriteEngine on 
# ADD RULES HERE 
RewriteCond x x # This is a dummy condition that is always true 
RewriteRule \.html$ /aternate_page.html [R=302,L] 

Тогда вы можете иметь свою работу по замене, как это:

<?php 
file_put_contents(".htaccess",str_replace("# ADD RULES HERE","# ADD RULES HERE\nRewriteCond %{REMOTE_HOST} ^".$_SERVER['REMOTE_ADDR']."$",file_get_contents(".htaccess")); 
?> 

HTH
(Edit: Это Безразлично» t кажется совершенно правильным ... Так что может потребоваться небольшое редактирование. Надеюсь, что общая идея помогает.)

+0

Да, но после первого мне не нужен другой фиктивный для редактирования – DonJuma

+0

Нет, фиктивный номер все равно будет там. Я все еще думаю, что что-то не так с кодом, который я написал, но я не могу понять, что =/ –

0

Правильным способом было бы использовать функцию гейткипера functio n, который проверяет IP и перенаправляет запрос на нужную страницу по мере необходимости.

<?php 

header('Location: http://www.yoursite.com/new_page.php'); 

?> 

Вы должны позвонить этому, прежде чем какой-либо вывод будет отправлен в браузер, включая любые теги HTML или пробелы. Обычный способ заключается в том, чтобы функция «вперед» обертывала команду заголовка и сначала выполняла контроль доступа, прежде чем отправлять какой-либо контент.

3

Вам не нужно использовать .htaccess для перенаправления пользователей на другие страницы, просто используйте locationheader, основываясь на том, что вы получаете от $_SERVER['REMOTE_ADDR']:

header("Location: http://anothersite.com") 

и не забывать об этом (из PHP руководство):

Помните, что заголовок() должен быть вызван прежде, чем любой фактический выход посылается, либо обычные HTML-теги, пустые строк в файле, или из PHP. Это очень распространенная ошибка, чтобы читать код с include() или require(), function или другой функцией доступа к файлу и иметь пробелы или пустые строки, которые выводятся перед вызовом header().

+1

+1 Если OP не пытается автоматизировать настройку веб-хостинга (что-то вроде CPanel), перенаправление в скрипте, безусловно, путь. – deceze

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