2012-07-25 11 views
17

Attualmente sto reindirizzando tutti gli utenti ad eccezione del 12.345.678.90 IP utilizzando:Redirect una serie di indirizzi IP utilizzando RewriteCond

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

Cosa sintassi dovrei usare per consentire un intervallo? Nella mia lista Consenti ho:

Allow from 123.45.678.90/28 

funzionerebbe se ho appena aggiornare la linea REMOTE_HOST a:

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

risposta

19

Probabilmente si desidera il %{REMOTE_ADDR} per abbinare contro, ma non si può usare la notazione CIDR come %{REMOTE_ADDR} è letteralmente l'indirizzo remoto ed è possibile utilizzare un'espressione regolare per provare a corrispondere con esso. Così, per 123.45.67.89/28, (123.45.67.80 - 123.45.67.95), che avrebbe dovuto fare qualcosa di simile:

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

Se stai usando Apache HTTPD 2.4 o successiva, è possibile utilizzare expressions per abbinare REMOTE_ADDR a una maschera CIDR.

breve modulo simile a questa:

RewriteCond expr "-R '192.168.1.0/24'" 

Il presente modulo è più disponibile anche, ma la documentazione suggerisce che è meno efficiente:

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

che rende la soluzione completa per il tuo esempio qualcosa di simile:

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

Domanda: Potresti dare un esempio al modulo breve? Non è chiaro come faccia riferimento a '% {REMOTE_ADDR}', mentre '% {REMOTE_ADDR}' è esplicitamente indicato nella forma più lunga. – plusjeff

+0

@plusjeff Non sono sicuro di cosa intendi: l'esempio del modulo breve è incluso sopra. Dalla documentazione collegata, -R è 'Uguale a"% {REMOTE_ADDR} -ipmatch ... ", ma più efficiente'. – zts

+0

È '-R' nella forma abbreviata rappresentativa di'% {REMOTE_ADDR} '? In tal caso, come si usa la forma abbreviata ad alte prestazioni per controllare una variabile diversa (per esempio dire che volevo controllare una variabile chiamata '% {CLIENT_IP}' con la forma abbreviata? Se uso una variabile diversa, devo sempre usa il modulo più lungo? – plusjeff

0

Mi piace usare il seguente che consente la corrispondenza dell'indirizzo parziale. Nel file 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] 

Spero che sia d'aiuto.

Problemi correlati