Apache 2.4: Exiger un utilisateur valide uniquement pour des hôtes spécifiques

Je veux indiquer à Apache 2.4.9 de demander un utilisateur valide si l’hôte est dev.example.com ou test.example.com. Cela ne fonctionne pas:

AuthType Basic AuthName "Speak, friend, and enter." AuthBasicProvider file AuthUserFile /sites/example/conf/.htpasswd AuthGroupFile /dev/null SetEnvIfNoCase Host ^dev\.example\.com$ env_is_protected SetEnvIfNoCase Host ^test\.example\.com$ env_is_protected Require valid-user Require not env env_is_protected 

Cela provoque une erreur de serveur; évidemment not env n’est pas valide contrairement à la documentation .

Dans les exemples suivants, les cinq premières lignes sont toujours les mêmes que dans le premier exemple.

Cela ne fonctionne pas:

 SetEnvIfNoCase Host ^dev\.example\.com$ env_is_protected SetEnvIfNoCase Host ^test\.example\.com$ env_is_protected  Require valid-user  Require env env_is_protected   

Cela provoque une erreur de serveur. La documentation explique :

Les directives d’autorisation négatives ne pouvant pas renvoyer de résultat, elles ne peuvent pas influencer de manière significative le résultat de la directive . (Tout au plus, ils pourraient faire échouer la directive dans le cas où ils ont échoué et toutes les autres directives ont renvoyé une valeur neutre.) Par conséquent, les directives d’autorisation négatives ne sont pas autorisées dans une directive .

Cela ne fonctionne pas:

 SetEnv env_is_unprotected 1 SetEnvIfNoCase Host ^dev\.example\.com$ !env_is_unprotected SetEnvIfNoCase Host ^test\.example\.com$ !env_is_unprotected Require valid-user Require env env_is_unprotected 

La documentation explique à propos de SetEnv :

Les variables d’environnement internes définies par cette directive sont définies après l’exécution de la plupart des directives de traitement des demandes, telles que le contrôle d’access et le mappage d’URI à nom de fichier. Si la variable d’environnement que vous définissez est destinée à entrer dans cette phase initiale du traitement, telle que la directive RewriteRule, vous devez plutôt définir la variable d’environnement avec SetEnvIf.

Cela marche:

 SetEnvIf Host . env_is_unprotected SetEnvIfNoCase Host ^dev\.example\.com$ !env_is_unprotected SetEnvIfNoCase Host ^test\.example\.com$ !env_is_unprotected Require valid-user Require env env_is_unprotected 

Cela ressemble à un piratage et prend des heures à comprendre. Est-ce que j’ai échoué à découvrir la manière appropriée d’accomplir mon but très simple? Y a-t-il une meilleure façon?

C’est comme ça que je le fais.
(Utiliser la citation de Cj Case comme commentaire pour expliquer les détails.: D)

 SetEnvIfNoCase HOST ^dev\.example\.com$ env_is_protected SetEnvIfNoCase HOST ^test\.example\.com$ env_is_protected   # when the Require directive is negated it can only fail or return a neutral result, # and therefore may never independently authorize a request # (reason why we need an additional "all granted" here!) Require all granted Require not env env_is_protected  AuthType Basic AuthName "Speak, friend, and enter." AuthUserFile /sites/example/conf/.htpasswd Require valid-user  

Vous ne pouvez utiliser que la directive “not” sur un bloc RequireAll et non comme une directive d’authentification.

Le résultat de la directive Require peut être annulé par l’utilisation de l’option not. Comme avec l’autre directive d’autorisation négative, lorsque la directive Require est annulée, elle ne peut qu’échouer ou renvoyer un résultat neutre et, par conséquent, ne peut jamais autoriser de manière indépendante une demande.

http://httpd.apache.org/docs/2.4/mod/mod_authz_core.html#require

Cela fonctionnerait probablement:

  AuthType Basic AuthName "Speak, friend, and enter." AuthBasicProvider file AuthUserFile /sites/example/conf/.htpasswd AuthGroupFile /dev/null SetEnvIfNoCase Host ^dev\.example\.com$ env_is_protected SetEnvIfNoCase Host ^test\.example\.com$ env_is_protected  Require valid-user Require not env env_is_protected