2012-07-25 3 views
17

В настоящее время я перенаправлять все пользователь для IP 12.345.678.90 исключения использования:Перенаправление диапазона IP-адреса с использованием RewriteCond

RewriteEngine On 
RewriteCond %{REQUEST_URI} !/maintenance$ 
RewriteCond %{REMOTE_HOST} !^12\.345\.678\.90 
RewriteRule $ /maintenance [R=302,L] 

Что синтаксис я использовал бы, чтобы диапазон? В моем списке Разрешить у меня есть:

Allow from 123.45.678.90/28 

Будет ли это работать, если я просто обновить REMOTE_HOST линию:

RewriteCond %{REMOTE_HOST} !^12\.345\.678\.90/28 

ответ

19

Вы, вероятно, хотите, чтобы соответствовать %{REMOTE_ADDR} против, но вы не можете использовать CIDR нотации поскольку %{REMOTE_ADDR} является буквально удаленным адресом, и вы можете использовать регулярное выражение, чтобы попытаться сопоставить его. Так что для 123.45.67.89/28 (123.45.67.80 - 123.45.67.95), то вы должны сделать что-то вроде этого:

RewriteCond %{REMOTE_ADDR} !^123\.45\.67\.8[0-9]$ 
RewriteCond %{REMOTE_ADDR} !^123\.45\.67\.9[0-5]$ 
12

Если вы используете Apache HTTPD 2.4 или более поздней версии, вы можете использовать expressions чтобы сопоставить REMOTE_ADDR с маской CIDR.

Короткая форма выглядит следующим образом:

RewriteCond expr "-R '192.168.1.0/24'" 

Следующая больше форма также доступна, но документация предполагает, что это менее эффективно:

RewriteCond expr "%{REMOTE_ADDR} -ipmatch '192.168.1.0/24'" 

Это делает полное решение для вашего примера что-то вроде этого:

RewriteEngine On 
RewriteCond %{REQUEST_URI} !/maintenance$ 
RewriteCond expr "! -R '12.345.678.90/28'" 
RewriteRule $ /maintenance [R=302,L] 
+0

Вопрос: Не могли бы вы привести пример в краткой форме? Непонятно, как он ссылается на '% {REMOTE_ADDR}', тогда как '% {REMOTE_ADDR}' явно отмечен в более длинной форме. – plusjeff

+0

@plusjeff Я не уверен, что вы имеете в виду - пример короткой формы включен выше. Из связанной документации, -R является «То же, что«% {REMOTE_ADDR} -ipmatch ... », но более эффективен». – zts

+0

Является ли '-R' в короткой форме представителем'% {REMOTE_ADDR} '? Если да, то как использовать короткую форму высокой производительности для проверки другой переменной (например, я хотел бы проверить переменную с именем «% {CLIENT_IP}» с короткой формой? Если я использую другую переменную, всегда ли мне нужно используйте длинную форму? – plusjeff

0

Мне нравится использовать следующее: позволяет частично согласовать адреса. В вашем virtualHost/htaccess файл

SetEnvIf HOST "siteYouAreworkingON.com" ACCESS_CONTROL<br> 
SetEnvIf Remote_Addr "list of full or partia ipadresses separated by |"<br> 
RewriteCond %{ENV:ACCESS_CONTROL} 1<br> 
RewriteRule .* http://gohere.instead [L,R] 

Надеюсь, это поможет.

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