J'aimerais autoriser l'accès à un seul pays, mais exclure les mandataires de ce pays.
C'est ce que j'ai (version abrégée pour plus de commodité)
<Limit GET POST>
order deny,allow
deny from all
allow from 139.82.0.0/16
allow from 143.54.0.0/16
allow from 186.192.0.0/11
allow from 186.224.0.0/11
.
deny from 186.201.27.66
deny from 186.201.196.1
deny from 186.214.51.231
deny from 186.237.225.26
</Limit>
Mais je sais que cela ne fonctionnera pas. Comment puis-je faire cela?
Update: pour le nouvel Apache 2.4 saute directement à la fin.
Le mot clé Order et sa relation avec les directives Deny
et Allow
constituent un véritable cauchemar. Il serait très intéressant de comprendre comment nous en sommes arrivés à une telle solution, une solution pour le moins non intuitive.
Order
aura un impact important sur la façon dont les directives Allow
et Deny
sont utilisées.Deny
et Allow
ne sont pas appliquées dans l'ordre dans lequel elles ont été écrites, elles doivent être considérées comme deux blocs distincts (un pour les directives for Deny
, un pour Allow
).Vous avez deux modes principaux:
Order Deny,Allow
Deny
.Deny
rejettent certaines demandes.Allow
.Je reformulerais comme suit:
Rule Deny
list of Deny rules
Except
list of Allow rules
Policy Allow (when no rule fired)
Order Allow,Deny
Allow
.Allow
.Allow
, vous pouvez toujours la rejeter avec une Deny
.Sous la forme simplifiée:
Rule Allow
list of Allow rules
Except
list of Deny rules
Policy Deny (when no rule fired)
Vous devez autoriser une liste de réseaux qui sont les réseaux de pays. Et dans ce pays, vous souhaitez exclure les adresses IP de certains mandataires.
Vous avez choisi le mode autoriser tout le monde, sauf-this-list-ou peut-être-pas. Ainsi, par défaut, personne peut accéder à votre serveur, à l'exception des adresses IP des mandataires répertoriés dans la liste Deny
ils sont rejetés par vous toujours autoriser les réseaux de pays. C'est trop large. Pas bon.
En inversant order allow,deny
, vous serez en mode rejetez tout le monde sauf cette liste ou peut-être pas . Ainsi, vous refuserez l'accès à tout le monde mais autoriserez les réseaux de pays, puis vous refuserez les mandataires. Et bien sûr, vous devez supprimer le Deny from all
indiqué par @Gerben et @Michael Slade (cette réponse explique uniquement ce qu'ils ont écrit).
Deny from all
est généralement utilisé avec order deny,allow
pour supprimer l'accès autoriser par défaut et créer une configuration simple et lisible. Par exemple, spécifiez une liste d'adresses IP autorisées après cela. Vous n'avez pas besoin de cette règle et votre question est le cas parfait d'un mode d'accès à 3 voies (stratégie par défaut, exceptions, exceptions aux exceptions).
Mais les gars qui ont conçu ces paramètres sont certainement fous.
L'ensemble du schéma d'autorisation a été refactored dans Apache 2.4 avec les directives RequireAll , RequireAny et RequireNone . Voir par exemple cet exemple de logique complexe .
Ainsi, l'ancienne logique étrange Order
devient une relique, et pour citer la nouvelle documentation:
Contrôler comment et dans quel ordre l'autorisation sera appliquée était un peu mystérieux dans le passé
Changez votre code en
<Limit GET POST>
deny from all
allow from 139.82.0.0/16
allow from 143.54.0.0/16
allow from 186.192.0.0/11
allow from 186.224.0.0/11
</Limit>
De cette façon, votre htaccess refusera tout sauf ceux que vous autorisez explicitement avec allow from..
Un proxy dans la plage autorisée peut facilement être remplacé par une règle deny from..
supplémentaire.
Utilisez simplement order allow,deny
à la place et supprimez la ligne deny from all
.
Comme l'a suggéré Gerben, il suffit de changer:
order deny,allow
deny from all
à
order allow,deny
Et les restrictions fonctionneront comme vous le souhaitez.
Les détails peuvent être trouvés dans la documentation d'Apache .
Ne répondez pas directement à la question sur les points de vente, mais pour les personnes qui trouvent cette question à la recherche de précisions sur la différence entre allow,deny
et deny,allow
:
Lire la virgule comme un "mais".
allow but deny
: liste blanche avec exceptions. deny but allow
: liste noire avec des exceptions. n'autoriser qu'un seul pays, mais exclure les mandataires de ce pays
OP avait besoin d'une liste blanche avec des exceptions, donc allow,deny
au lieu de deny,allow