Rediriger une gamme D'IPs en utilisant RewriteCond

actuellement, je redirige tous les utilisateurs sauf IP 12.345.678.90 en utilisant:

RewriteEngine On
RewriteCond %{REQUEST_URI} !/maintenance$
RewriteCond %{REMOTE_HOST} !^12.345.678.90
RewriteRule $ /maintenance [R=302,L]

Quelle syntaxe utiliser pour permettre une gamme? Dans ma liste j'ai:

Allow from 123.45.678.90/28

est-ce que ça marcherait si je mettais à jour la ligne REMOTE_HOST vers:

RewriteCond %{REMOTE_HOST} !^12.345.678.90/28
18
demandé sur xylar 2012-07-25 19:37:43

4 réponses

Vous voulez probablement l' %{REMOTE_ADDR} match contre, mais vous ne pouvez pas utiliser la notation CIDR comme le %{REMOTE_ADDR}littéralement l'adresse distante et vous pouvez utiliser une expression régulière pour essayer de faire correspondre. Alors pour 123.45.67.89/28, (123.45.67.80 - 123.45.67.95), vous devez faire quelque chose comme ceci:

RewriteCond %{REMOTE_ADDR} !^123\.45\.67\.8[0-9]$
RewriteCond %{REMOTE_ADDR} !^123\.45\.67\.9[0-5]$
20
répondu Jon Lin 2012-07-25 16:53:52

si vous utilisez Apache HTTPD 2.4 ou plus, vous pouvez utiliser expressions pour faire correspondre REMOTE_ADDR à un masque CIDR.

la forme courte ressemble à ceci:

RewriteCond expr "-R '192.168.1.0/24'"

la forme plus longue suivante est également disponible, mais la documentation suggère qu'elle est moins efficace:

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

cela rend la solution complète à votre exemple quelque chose comme ceci:

RewriteEngine On
RewriteCond %{REQUEST_URI} !/maintenance$
RewriteCond expr "! -R '12.345.678.90/28'"
RewriteRule $ /maintenance [R=302,L]
16
répondu zts 2017-02-11 22:55:24

j'aime utiliser ce qui suit qui permet une correspondance partielle des adresses. Dans Votre virtualHost/htaccess le fichier

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]

j'Espère que ça aide.

0
répondu Roberto Sanchez 2016-12-06 18:47:43

bien qu'il s'agisse d'une vieille question, je la trouve encore très pertinente. Une alternative qui autorise la notation CIDR est la suivante (exemple dans un fichier de conf d'apache virtualhost):

<VirtualHost *:80>
    .
    .
    .
    <Files maintenance>
        Require all denied
        Require ip 12.345.678.90/28
    </Files>
    .
    .
    .
</VirtualHost>

comme un sidenote, Je suspect, sans avoir fait aucun test ou trouvé aucune preuve, que cette méthode est "plus rapide" que le RewriteCond expr "-R '192.168.1.0/24'" méthodes mentionnées.

C'est pour la simple raison qu'à ce haut niveau, il semble y avoir moins d'étapes de calcul impliquer.

N.B. un demandeur d'une IP qui est refusée verra une réponse de type" Permission denied "ou" Forbidden". Vous pouvez rendre cela plus joli en ajoutant dans une page 404 personnalisée que répondre avec un 200 / OK (de cette façon Google ne pénalisera pas votre domaine). 200/OK doit être la première ligne de votre page 404 personnalisée. Par exemple, en PHP, la première ligne se lirait comme suit:

<?php header("Status: 200 OK"); ?>

vous voulez faire cela pour une page légitime que vous redirigez. Les 404s actuels devraient répondre par 404 à nous empêcher de finir avec une tonne de résultats inutiles moteur de recherche sur la route.

0
répondu J-a-n-u-s 2018-04-23 16:14:35