2012-07-25 25 views
17

Actualmente estoy a redirigir todos los usuarios excepto para el IP 12.345.678.90 usando:redirigida un rango de direcciones IP que utilizan RewriteCond

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

Qué sintaxis debería utilizar para permitir un rango? En mi lista Permitir que tengo:

Allow from 123.45.678.90/28 

¿funcionaría si acabo de actualizar la línea de REMOTE_HOST:

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

Respuesta

19

es probable que desee el %{REMOTE_ADDR} a contrastar, pero no se puede utilizar la notación CIDR como %{REMOTE_ADDR} es literalmente la dirección remota y puede usar una expresión regular para intentar hacer coincidir. Así que para 123.45.67.89/28, (123.45.67.80 - 123.45.67.95), que tendría que hacer algo como esto:

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

Si estás usando Apache HTTPD 2.4 o posterior, puede utilizar expressions para unir REMOTE_ADDR con una máscara CIDR.

La forma corta se parece a esto:

RewriteCond expr "-R '192.168.1.0/24'" 

La siguiente forma más larga también está disponible, pero la documentación sugiere que es menos eficiente:

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

Eso hace que la solución completa a su ejemplo algo como esto:

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

Pregunta: ¿Podría dar un ejemplo a la forma abreviada? No está claro cómo hace referencia a '% {REMOTE_ADDR}', mientras que '% {REMOTE_ADDR}' se menciona explícitamente en la forma más larga. – plusjeff

+0

@plusjeff No estoy seguro de lo que quiere decir: el ejemplo de la forma abreviada se incluye arriba. De la documentación vinculada, -R es 'Igual que"% {REMOTE_ADDR} -ipmatch ... ", pero más eficiente'. – zts

+0

¿'-R' en la forma abreviada es representativo de'% {REMOTE_ADDR} '? Si es así, ¿cómo se usa la forma abreviada de alto rendimiento para verificar una variable diferente (es decir, decir que quería verificar una variable llamada '% {CLIENT_IP}' con la forma abreviada? Si utilizo una variable diferente, siempre tengo que use la forma más larga? – plusjeff

0

Me gusta usar lo siguiente que permite la correspondencia de direcciones parciales. En Su virtualHost/htaccess archivo

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] 

Espero que ayude.

Cuestiones relacionadas