2013-08-09 4 views
5

У нас есть каталог на нашем сайте, который мы хотим получить только через пару IP-адресов. Таким образом, у нас есть этот файл .htaccess, чтобы попытаться заставить его работать:Разрешить определенным IP-адресам доступ к сайту с помощью mod_rewrite?

RewriteEngine on 
RewriteCond %(REMOTE_ADDR) !^123\.123\.123\.123 
RewriteCond %(REMOTE_ADDR) !^124\.124\.124\.124 
RewriteCond %{REMOTE_ADDR} !^125\.125\.125\.125 
RewriteCond %{REMOTE_ADDR} !^126\.126\.126\.126 
RewriteCond %{REMOTE_ADDR} !^127\.127\.127\.127 
RewriteCond %{REMOTE_ADDR} !^128\.128\.128\.128 

RewriteCond %{HTTP_REFERER} !^http://www\.example\.com/ [NC] 
RewriteCond %{HTTP_REFERER} !^http://example\.com/ [NC] 

RewriteRule ^.*$ http://www.example.com [R=301,L] 

То, что мы хотим, чтобы это сделать, если запрос не исходит от одного из наших IP-адресов (очевидно, изменил их в коде выше всего для примеров), или реферер не приходит с определенного сайта, а затем перенаправляет их в другое место.

По какой-то странной причине он работает для IP-адреса, который находится в позиции 126.126.126.126, но не работает для других. На самом деле не могу понять, почему это будет отличаться в зависимости от IP. Что может пойти не так?

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

+0

Вы использовали тот же браузер? Вы не указали URL-адрес сайта в самой адресной строке браузера? (референт будет пуст тогда) – Nicolas

+0

Я пробовал свежие браузеры, чтобы убедиться, что это не проблема кеширования. И он * должен * работать непосредственно, набирая URL-адрес в новое окно браузера. Он отлично подходит для одного из IP-адресов. Реферер необходим только в том случае, если ни один из IP-адресов не соответствует. Так что если они (НЕ от IP1 И НЕ от IP2 И НЕ от IP3 ... И реферер не идет с сайта x, а затем избавиться от них). – BT643

ответ

9

Забыл ответить на этот вопрос. Это было просто опечатка в конце .. DOH!

Если вы заметили, что некоторые из строк% {REMOTE_ADDR} имеют фигурные скобки, а некоторые имеют обычные скобки! Им всем нужны кудрявые.

RewriteEngine on 
RewriteCond %{REMOTE_ADDR} !^123\.123\.123\.123 
RewriteCond %{REMOTE_ADDR} !^124\.124\.124\.124 
RewriteCond %{REMOTE_ADDR} !^125\.125\.125\.125 
RewriteCond %{REMOTE_ADDR} !^126\.126\.126\.126 
RewriteCond %{REMOTE_ADDR} !^127\.127\.127\.127 
RewriteCond %{REMOTE_ADDR} !^128\.128\.128\.128 

RewriteCond %{HTTP_REFERER} !^http://www\.example\.com/ [NC] 
RewriteCond %{HTTP_REFERER} !^http://example\.com/ [NC] 

RewriteRule ^.*$ http://www.example.com [R=301,L] 
1

Я думаю, вы должны добавить [OR] модификатор после каждого RewriteCond, как это:

RewriteEngine on 
RewriteCond %{REMOTE_ADDR} !^123\.123\.123\.123 [OR] 
RewriteCond %{REMOTE_ADDR} !^124\.124\.124\.124 [OR] 
... 
+1

это неправильно - подумайте. Используя логику '[OR]', правило будет всегда * соответствовать *, поскольку IP всегда будет * не * одним из тех, что перечислены в списке, и поэтому каждый будет перенаправлен независимо от своего IP-адреса. – billynoah

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