conditions htaccess
-
29-09-2020 - |
Question
J'ai configuré l'authentification htpasswd sur mon site en direct et cela fonctionne très bien, mais je ne veux pas qu'on me demande un mot de passe lorsque je travaille sur l'environnement de développement.
Dans mon fichier httpd.conf j'ai :
SetEnv APP_ENV "development"
Dans mon .htaccess
fichier que j'ai :
AuthName "Restricted Area"
AuthType Basic
AuthUserFile /path/to/file/.htpasswd
AuthGroupFile /dev/null
require valid-user
Je me demandais s'il était possible de mettre un conditionnel autour du truc htppasswd pour que lorsque APP_ENV
est development
que je ne reçois pas de mot de passe.
Est-ce possible?
La solution
Si vous en êtes capable, vous devriez penser à passer à Apache2.4 (ou la dernière version bêta 2.3 puisque la version 2.4 n'est pas encore tout à fait publiée).
L'une des nouvelles fonctionnalités disponibles est Conteneurs d'autorisation - rendant beaucoup plus simple la définition des exigences d'accès à l'aide du Exiger directif.
Vous devriez obtenir quelque chose comme :
AuthName "Restricted Area"
AuthType Basic
AuthUserFile /path/to/file/.htpasswd
AuthGroupFile /path/to/file/groups
SetEnv APP_ENV "development"
<RequireAll>
<RequireAny>
<RequireAll>
#main requirements
Require group user
#other conditions if needed for non-dev/non-local
</RequireAll>
<RequireAll>
#allow direct if development
Require env APP_ENV development
</RequireAll>
<RequireAll>
<RequireAny>
#allow loopback and local network
Require ip 127.0.0.1
Require ip 10.2
</RequireAny>
</RequireAll>
<RequireAny>
#other conditions if needed for everyone
<RequireNone>
#blacklist
</RequireNone>
</RequireAll>
Autres conseils
L'une des façons de construire des blocs conditionnels avec des variables d'environnement consiste à utiliser mod_macro module.J'ai fait un exemple précédemment ici.
Dans ce cas particulier, vous auriez en haut du fichier VirtualHost (avant la définition de VirtualHost) :
<Macro ConditionalBlockMacroSecurity_production>
AuthName "Restricted Area"
AuthType Basic
AuthUserFile /path/to/file/.htpasswd
AuthGroupFile /dev/null
require valid-user
</Macro>
<Macro ConditionalBlockMacroSecurity_development >
<IfModule mod_headers.c>
Header set MyHeader "Hello this is DEVELOPMENT envirronment. It took %D microseconds for Apache to serve this request."
</IfModule>
</Macro>
Et à l'intérieur du Virtualhost :
Use ConditionalBlockMacroSecurity_${APP_ENV}
où le chemin d'accès au fichier htpassword peut également être défini comme paramètre de la macro.
L'inconvénient de cette solution est que vous devez installer mod_macro sur le serveur de production, ce n'est pas un module couramment installé et vous aurez besoin d'un certain contrôle sur l'environnement de production pour ce faire.D'un autre côté, une solution simple est d'avoir plusieurs versions de vos hôtes virtuels en fonction de l'environnement, et d'ajouter quelques commentaires sur la section Auth.Mais si vous recherchez une solution générique, cela signifie certainement que c'est un problème récurrent et que vous souhaitez éviter l'édition manuelle des fichiers. Dans de tels cas, mod_macro peut devenir un moyen très professionnel de capitaliser vos expériences Apache, jusqu'à ce que vos configurations Apache deviennent une seule macro. avec des paramètres, appelant beaucoup d'autres macros.
Les conditions dans la configuration Apache ne fonctionnent qu'une seule fois, lorsque la configuration est [re]chargée.
Ce que je ferais, c'est créer un deuxième VirtualHost avec le même répertoire racine et contrôler l'accès en utilisant Deny/Allow en fonction de l'adresse IP.
Ajoutez ce qui suit :
Require valid-user
Allow from <dev IP>
Satisfy Any
Cela nécessitera que Require valid-user
ou Allow from <dev IP>
s'applique.
Dans ton .htaccess
fichier, vous pouvez imbriquer les blocs dans la directive IfDefine, comme :
<IfDefine PROD>
bla bla bla
</IfDefine>
Alors assurez-vous de réussir -D PROD
comme argument lorsque vous démarrez Apache.Cette section ne s'exécuterait que si PROD est défini.Dans Ubuntu, vous pouvez le faire, par exemple, en éditant /etc/apache2/envvars
et en ajoutant cette ligne à la fin :
export APACHE_ARGUMENTS="-D PROD"
Vous pouvez "l'inverser" en utilisant peut-être quelque chose comme <IfDefine !DEV>
pour s'exécuter uniquement lorsque ce n'est pas l'environnement de développement, puis passer -D DEV dans cet environnement et laisser les sites de production tels quels sans avoir à modifier les variables d'environnement.
Modifiez en conséquence selon vos besoins !