web-dev-qa-db-fra.com

Rediriger une plage d'adresses IP à l'aide de RewriteCond

Actuellement, je redirige tous les utilisateurs sauf l'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 utiliserais-je pour autoriser une plage? Dans ma liste d'autorisation, j'ai:

Allow from 123.45.678.90/28

Cela fonctionnerait-il si je mettais simplement à jour la ligne REMOTE_Host à:

RewriteCond %{REMOTE_Host} !^12\.345\.678\.90/28
19
xylar

Vous voulez probablement que le %{REMOTE_ADDR} corresponde, mais vous ne pouvez pas utiliser la notation CIDR car le %{REMOTE_ADDR} est littéralement l'adresse distante et vous pouvez utiliser une expression régulière pour tenter de le faire correspondre. Donc 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]$
21
Jon Lin

Si vous utilisez Apache HTTPD 2.4 ou une version ultérieure, 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'"

Le formulaire plus long suivant est également disponible, mais la documentation suggère qu'il est moins efficace:

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

Cela donne la solution complète à votre exemple comme ceci:

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

Bien que cette question soit ancienne, je la trouve toujours très pertinente. Une alternative qui autorise la notation CIDR est la suivante (l'exemple est dans un fichier de configuration Apache de virtualhost):

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

Sidenote, je soupçonne , sans avoir fait d’essais ni trouvé de preuve, que cette méthode est "plus rapide" que les méthodes RewriteCond expr "-R '192.168.1.0/24'" mentionnées.

Ceci pour la simple raison qu’à ce niveau élevé, il semble y avoir moins d’étapes de calcul.

N.B. un demandeur d'une adresse IP refusée verra une réponse de type "Autorisation refusée" ou "Interdit". Vous pouvez rendre cela plus joli en ajoutant une page 404 personnalisée qui répond avec un 200/OK (de cette manière, Google ne pénalisera pas votre domaine). Le 200/OK doit être la première ligne de votre page 404 personnalisée. Par exemple, en PHP, la première ligne serait la suivante:

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

Vous voudriez faire ceci pour une page légitime vers laquelle vous redirigez. Les 404 réels devraient réagir avec 404 pour nous empêcher de nous retrouver avec une tonne de résultats inutiles sur les moteurs de recherche.

1
J-a-n-u-s

J'aime utiliser ce qui suit qui permet la correspondance d'adresse partielle. Dans votre fichier 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]

J'espère que ça aide.

0
Roberto Sanchez