2009-08-31 4 views
8

J'ai plusieurs sites: example.com, example1.com et example2.com. Tous pointent vers le dossier /public_html de mon serveur, qui est mon dossier racine Apache.Utiliser l'authentification HTTP uniquement si j'accède à un domaine spécifique

Que dois-je ajouter à mon fichier .htaccess pour utiliser l'authentification http uniquement si l'utilisateur provient de example2.com? example.com et example1.com ne doit pas utiliser l'authentification.

Je sais que je dois quelque chose comme

AuthType Basic 
AuthName "Password Required" 
AuthUserFile "/path/to/.htpasswd" 
Require valid-user 

Mais je veux seulement besoin d'un mot de passe si l'utilisateur visite example2.com.

Modifier

En utilisant une approche suggérée dans une réponse, je suit dans mon fichier .htaccess:

SetEnvIfNoCase Host ^(.*)$ testauth 
<IfDefine testauth> 
RewriteRule ^(.*)$ index2.php?q=$1 [L,QSA] 
</IfDefine> 

Je sais que le module mod_setenvif.c est activé (je l'ai vérifié avec un < IfModule> block), mais il semblerait que "testauth" ne soit jamais défini, car mon test à vérifier (rediriger vers index2.php) n'est pas en cours d'exécution (alors qu'il était exécuté dans mon bloc < IfModule>). Des idées pourquoi?

+0

Si tous les domaines pointent vers le même endroit, pourquoi voudriez-vous protéger seulement l'un d'entre eux? Si vous utilisez réellement un contenu différent, pourquoi ne pas adopter une approche plus saine comme un dossier par domaine? –

+0

Je lance une installation Drupal multisite à partir de mon dossier/public_html, et je souhaite créer une autorisation http globale sur l'un des sites, en plus de la connexion utilisateur normale de ce site. –

+0

Le multisite de Drupal me permet d'exécuter différents sites Web à partir du même ensemble de fichiers PHP, mais avec des bases de données différentes (donc un contenu différent). Je pourrais faire une deuxième installation dans un sous-dossier, mais cela m'obligerait à maintenir des ensembles distincts de fichiers et de modules. –

Répondre

1

Vous ne devriez pas mettre la configuration par vhost dans .htaccess. Au lieu de cela, placez le bloc de configuration dans le bloc VirtualHost dans le fichier de configuration approprié au /etc/apache/sites-enabled/*.

+0

Je n'ai malheureusement pas accès aux fichiers vhost. Je cours tout cela sur un serveur d'hébergement partagé via CPanel. = ( –

2

Je me demande si DanH serait aidé par une approche qui permet l'accès par adresse IP?

Quelque chose comme

SetEnvIf Remote_Addr 1\.2\.3\.4 AllowMeIn 
SetEnvIfNoCase Host this\.host\.is\.ok\.com AllowMeIn 
SetEnvIfNoCase Host this\.host\.is\.also\.ok\.com AllowMeIn 

puis dans votre Drupal "contenant"

Order Allow,Deny 
Allow from env=AllowMeIn 

devrait faire l'affaire.

Tout hôte qui est "en ligne" doit être configuré sur "AllowMeIn", ou bien vous devez provenir d'une adresse IP connue (c'est-à-dire vous et d'autres développeurs).

+0

parfait, il fonctionne grâce à 4 octroi de subvention heures – DanH

16

Que diriez-vous quelque chose le long des lignes de ce dans le fichier .htaccess à la racine du document:

# set the "require_auth" var if Host ends with "example2.com" 
SetEnvIfNoCase Host example2\.com$ require_auth=true 

# Auth stuff 
AuthUserFile /var/www/htpasswd 
AuthName "Password Protected" 
AuthType Basic 

# Setup a deny/allow 
Order Deny,Allow 
# Allow for everyone 
Allow from all 
# Except if a auth is required 
Deny from env=require_auth 
# But if you have a user you are welcome 
Require valid-user 
# Auth OR access, not AND https://wiki.apache.org/httpd/BypassAuthenticationOrAuthorizationRequirements 
Satisfy any 

Cela fera si l'authentification n'est pas nécessaire à moins que l'hôte se termine par example2.com (par exemple www.example2.com, dev.example2.com, etc.). L'expression peut être modifiée si nécessaire. Tout autre hôte provoquera l'initialisation de la variable require_auth. L'authentification est donc et non requise. Si cela doit être l'inverse, la dernière ligne peut être remplacée par: Allow from env=require_auth, en supprimant le !.

+2

Pour moi require_auth ne fonctionne pas, mais cela ne:! Allow de tous deny from env = require_auth Require valid utilisateur tout –

+0

Merci Satisfy beaucoup –

+0

Les utilisateurs d'Afaik pourraient être en mesure de l'exploiter en demandant "example2.com" (notez le point à la fin) .Votre règle devrait plutôt être "SetEnvIfNoCase Host example2 \ .com \.? $ ..." sinon le contenu pourrait être encore visible sans protection. – Matmarbon

5

Voici une recommandation:

Créer un fichier appelé common.conf et enregistrer dans un endroit accessible

Dans ce lieu de fichier la configuration Apache commune à tous les sites (hôtes).

Le supprimer la seule entrée VirtualHost actuelle une remplacer par des entrées VirtualHost comme suit:

# These are the password protected hosts 
<VirtualHost *:80> 
ServerName example.com 
ServerAlias example1.com 

Include /path-to-common-configuration/common.conf 

AuthType Basic 
AuthName "Password Required" 
AuthUserFile "/path/to/.htpasswd" 
Require valid-user 
</VirtualHost> 

# These are hosts not requiring authentication 
<VirtualHost *:80> 
ServerName example2.com 
ServerAlias example3.com 

Include /path-to-common-configuration/common.conf 

</VirtualHost> 
1

Apache 2.4 offre une alternative sémantique à la directive If:

<If "req('Host') == 'example2.com'"> 
    AuthUserFile /path/to/htpasswd 
    AuthType Basic 
    AuthName "Password Protected" 
    Require valid-user 
</If> 
<Else> 
    Require all granted 
</Else> 
Questions connexes