web-dev-qa-db-fra.com

Apache 2.4 restreint l'URL à certaines IP

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.

14
Denis Rendler

Utilisez Order, Deny et allow pour spécifier qui a accès à votre vhost ou 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>

Quand il s'agit de rediriger, pensez à un page d'erreur personnalisée . Ceci est beaucoup plus général, car chaque accès non autorisé doit provoquer une erreur 403 et peut donc être évalué facilement.

Je n'ai jamais fait cela 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)

4
ansi_lumen

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 ce qui suit:

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

Plus d'informations sont disponibles sur le 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!

23
Linztm

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

2
MontyThreeCard