Apache 2.4 restreint l'URL à certaines IP

14

J'essaie de restreindre une URL spécifique à être disponible en dehors du réseau uniquement à des adresses IP spécifiques. Lorsqu'un utilisateur extérieur essaie d'accéder à cette URL et non à partir de la liste des adresses IP, il doit être redirigé vers la page d'accueil.

C'est ce que j'ai essayé jusqu'à présent sans aucune chance. La dernière partie, il redirige tout le monde vers la page d'accueil quelle que soit l'IP.

<Location "/secret">
#    <If "%{REMOTE_ADDR} != -ipmatch '123.123.123.123/255.255.255.255'">
#    Redirect 303 "/secret" /
#    </If>

RewriteCond "%{REMOTE_ADDR}" "!123\.123\.123\.123"
RewriteRule .* / [R,L]

LogLevel debug rewrite:trace6
</Location>

PS: l'URL / secret est en fait une URL virtuelle et n'existe pas physiquement sur le lecteur.

Denis Rendler
la source
Si les déclarations sont commentées? Activer la réécriture - RewriteEngine On?
user9517
L'instruction <If> est une version que j'ai essayée. La directive RewriteEngine On est déclarée plus tôt. C'est la raison pour laquelle il redirige tout le monde
Denis Rendler
1
Je pense que vous devriez décocher la réponse sélectionnée, car elle n'est pas valide pour Apache 2.4 comme vous l'avez demandé (cela donne des informations erronées aux personnes qui passent)
Erenor Paz

Réponses:

4

Utilisez Order, Denyet allowde préciser qui a accès à votre serveur virtuel ou l' emplacement.

<VirtualHost *:80>
    ServerName example.net
    DocumentRoot /docroot

    <Directory "/docroot">
        Order Deny,Allow
        Deny from all
        Allow from 10.10.10.10
        Allow from 10.10.11.0/24
    </Directory>   
</VirtualHost>

En ce qui concerne la redirection, pensez à une page d'erreur personnalisée . Ceci est beaucoup plus général, car tout accès non autorisé doit provoquer une erreur 403 et peut donc être évalué facilement.

Je n'ai jamais fait ça avec apache, mais utilisez cette stratégie avec nginx. Pour apache quelque chose comme ça devrait faire:

ErrorDocument 403 http://homepage.example.com

Les documents d'erreur personnalisés sont configurés à l'aide de la directive ErrorDocument, qui peut être utilisée dans un contexte global, virtualhost ou répertoire. Il peut être utilisé dans les fichiers .htaccess si AllowOverride est défini sur FileInfo. (à partir des documents apache)

ansi_lumen
la source
2
Cela ressemble à un ensemble de configuration Apache httpd 2.2. Cela fonctionnera-t-il toujours avec 2.4?
user9517
Au moins, la ErrorDocumentpartie provient des 2.4 docs. Je ne me apache, puisque nginx est autour, mais suppose que Order, Denyet Allowsont toujours là dans apache 2.4
ansi_lumen
Merci, mais je n'aide pas. J'ai oublié de mentionner, mais j'ai mis à jour la question, l'URL / secret est en fait une URL virtuelle et n'existe pas physiquement sur le lecteur. L'URL elle-même est une réécriture de index.php c'est pourquoi j'ai utilisé la directive <Location>.
Denis Rendler
4
Cette syntaxe est déconseillée dans apache 2.4
Luca Reghellin
1
Pourquoi est-ce la réponse acceptée? C'est pour Apache 2.2 et non 2.4 comme la question l'indique ... Cela ne fonctionnera pas.
Jeremy
23

Les options Ordre, Refuser et Autoriser ont été remplacées dans Apache 2.4 par

<Directory /var/www/mysite.com/htdocs/public>
    Require all granted
</Directory>

Vous pouvez restreindre explicitement les adresses en utilisant les éléments suivants:

<Directory /var/www/mysite.com/htdocs/public>
    Require all granted
    Require not ip 192.168.0.1
</Directory>

L'inverse est également vrai, pour tout restreindre et autoriser uniquement un sous-ensemble à utiliser les éléments suivants:

<Directory /var/www/mysite.com/htdocs/public>
    Require host example.com
    Require ip 192.168.0.1
</Directory>

Plus d'informations sont disponibles sur la documentation de contrôle d'accès Apache 2.4.

En ce qui concerne votre question (édité la mienne en raison d'un manque de points pour ajouter un commentaire), vous devriez pouvoir simplement définir un ErrorDocument avec l'index défini comme chemin URL:

<Directory /var/www/mysite.com/htdocs/public>
    Require host example.com
    Require ip 192.168.0.1
    ErrorDocument 401 /index.html
</Directory>

J'espère que cela t'aides!

Linztm
la source
Merci, @Linztm! Mais cela ne résout que partiellement mon problème. Je ne veux pas seulement bloquer l'utilisateur mais aussi le rediriger vers la page d'accueil.
Denis Rendler
Il semble fonctionner avec la directive ErrorDocument uniquement si je fournis l'URL complète, y compris le domaine et le protocole. Je poursuivrai mes recherches. Merci.
Denis Rendler
J'ai trouvé au moins un cas où vous devez utiliser, allowbien que déconseillé, Require 127.0.0.1 toujours autoriser l'accès par une adresse externe à partir d'une machine locale, alors que la syntaxe autorisée ne permet qu'à partir de 127 adresses.
Alexei Martianov
2

Pour Apache 2.4, vous pouvez utiliser <RequireAny>. Vous pouvez le faire dans un fichier vhost ou .htaccess ....

SetEnvIF IP xxx.xxx.xxx.xxx AllowThisIP  # Or X-Real-IP
SetEnvIF IP yyy.yyy.yyy.yyy AllowThisIP
<RequireAny>
  Require env AllowThisIP
  Require host example.com
</RequireAny>

Documents Apache https://httpd.apache.org/docs/2.4/mod/mod_authz_core.html#requireany

MontyThreeCard
la source