Comment configurer un mod_rewrite pour vérifier à la fois l’adresse IP directe et l’adresse IP proxy?

J’essaie de configurer notre fichier wordpress .htaccess pour qu’il bloque l’access aux pages wordpress wp-login.php et admin à moins que le client ne provienne de nos réseaux.

L’environnement de développement est directement accessible, mais la production est derrière un proxy, donc pour garder les choses simples, je voulais configurer un ensemble de règles qui s’appliquerait dans les deux cas.

J’ai configuré l’ensemble de règles ci-dessous qui, en fonction de mes recherches, devrait fonctionner:

#only allow use of wp-login or wp-admin from users inside RewriteCond %{REQUEST_URI} ^(.*)?wp-login\.php(.*)$ [OR] RewriteCond %{REQUEST_URI} ^(.*)?wp-admin$ RewriteCond %{REMOTE_ADDR} !^192\.168\.(1|2|3|4)\.[0-9]{1,3}$ [OR] RewriteCond %{HTTP:X-FORWARDED-FOR} !^192\.168\.(1|2|3|4)\.[0-9]{1,3}$ RewriteRule ^(.*)$ - [R=403,L] 

Cependant, pour une raison quelconque, le [OR] entre le REMOTE_ADDR et le X-FORWARDED-FOR semble être ignoré, ce qui provoque le blocage des pages dans tous les cas.

Est-ce que je manque quelque chose?

Edit: Je n’aurais pas dû avoir la condition OU pour commencer. Apparemment, mon cerveau n’avait pas assez de café pour calculer les opérations binarys de base.

Je suppose que vos clients passent par un proxy ou par une connexion directe. Comme vous les bloquerez si EITHER ne correspond pas, vous les bloquerez probablement tous. Quelqu’un venant via un proxy local devrait passer. Je ne ferais pas les choses XFF dans les .htacces, utilisez si possible mod_remoteip et ne faites confiance qu’à vos propres proxys, car cet en-tête peut être facilement usurpé par le client.

De plus, le $ dans la ligne wp-admin signifie qu’il ne correspondra pas à wp-admin / edit.php. Considérez aussi que les requêtes WP ajax passent par wp-admin / admin-ajax.php, et vous pourriez en avoir besoin.