2010-11-01 3 views
19

Nous avons des serveurs locaux, des serveurs centraux, des serveurs de stockage et de production. Cependant, le dev et la mise en scène sont protégés par un mot de passe pour des raisons évidentes. Donc, après avoir déployé des modifications sur l'accès htaccess, je dois éditer manuellement le fichier htaccess pour activer la protection par mot de passe sur le serveur de développement et de transfert.Blocs de code spécifiques au nom de domaine dans htaccess

Est-il possible d'avoir des blocs conditionnels en fonction du nom de domaine comme:

if ($domain == "dev.example.com" || $domain == "staging.example.com"){ 
    AuthName "Password Protected Area" 
    AuthType Basic 
    AuthUserFile /somewhere/.htpasswd 
    Require valid-user 
} 

Je dois trouver l'équivalent htaccess de la condition:

if ($domain == "dev.example.com" || $domain == "staging.example.com"){ 

} 

Je vous serais reconnaissant la toute aide ou des pointeurs que vous pouvez donner.

Répondre

28

tout en le faisant à travers le VirtualHost et non un .htaccess est beaucoup mieux, vous pouvez utiliser la solution suivante si le module SetEnvIf est actif:

SetEnvIf Host ^dev\.site\.com$ is_on_dev_site 
SetEnvIf Host ^staging\.site\.com$ is_on_dev_site 
Order deny,allow 
Deny from env=is_on_dev_site 
# require password if access would otherwise be denied 
Satisfy any 
# Put your password auth stuff here 

Vous pouvez aussi le faire avec une liste blanche qui est probablement mieux, car il garantit que vos sites dev sont toujours protégés, même si quelqu'un décide d'autoriser leur accès via www.dev.site.com etc .:

SetEnvIf Host ^site\.com$ is_on_public_site 
SetEnvIf Host ^www\.site\.com$ is_on_public_site 
Order deny,allow 
Deny from all 
Allow from env=is_on_public_site 
Satisfy any 
# Put your password auth stuff here 

Si vous n'avez pas mod_setenvif sur votre serveur, mod_rewrite peut aussi faites le travail pour vous (remplacez les blocs SetEnvIf l'exemple whitelist avec ce qui suit):

RewriteEngine On 
RewriteCond %{HTTP_HOST} =site.com 
RewriteRule^- [E=is_on_public_site:yes] 
RewriteCond %{HTTP_HOST} =www.site.com 
RewriteRule^- [E=is_on_public_site:yes] 
+0

Juste un avertissement concernant la sécurité: HTTP_HOST est fourni par le client, et est spoofable. En outre, certains procurent la valeur hors de sorte que vous ne pouvez même pas compter sur sa présence. Vous devez utiliser SERVER_NAME fourni par le serveur. – Andri

+3

Lorsque des hôtes virtuels basés sur des noms sont impliqués, je ne pense pas que HTTP_HOST soit spoofable.Ou pour être plus exact, il est spoofable bien sûr mais alors la demande n'atteindra jamais sa destination prévue. – ThiefMaster

+0

Donc, si la requête vient avec un HTTP_HOST qui ne correspond à aucun des hôtes virtuels, il ne va nulle part? – Andri

1

Vous devriez faire ceci dans vos sites fichier conf avec:

<VirtualHost domain.com:80> 

...config statements here 

</VirtualHost> 

et

<VirtualHost domain2.com:80> 

....config statements here 

</VirtualHost> 

Si vous êtes un hôte qui ne vous permet pas de modifier vos sites fichier de configuration, qui est une vraie possibilité si vous êtes avec un hôte partagé alors vous devriez envisager VPS ou hébergement dédié.

+1

je peux le faire, mais je ne veux pas faire un peu de changements sur tous les serveurs .. je suis paresseux! :) –

5

J'ai trouvé une bonne solution pour distinguer « localhost » par rapport à « live »:

Depuis les conditionals de htaccess sont quelque peu limitées pourquoi ne pas se contenter de IfModule? : Comparez les modules que vous avez (ie utiliser, et rechercher une différence significative, espérée à long terme, par ex. si vous développez sur Windows et déployez sur linux mod_win32.c pourrait être bon. (Ne pas oublier d'ajouter le .c qui phpinfo() ommits.)

Ensuite, vous pouvez aller à ce sujet comme celui-ci (testé):

<IfModule mod_win32.c> 
    RewriteRule ^banana$ test.php?dudeThisIsLocal=1 
</IfModule> 
<IfModule !mod_win32.c> 
    RewriteRule ^banana$ test.php?dudeThisIsLive=1 
</IfModule> 

Cet exemple fait un bon test santé mentale, browing à votredomaine/banane resp. localhost/banana et si vous (ayant réécrit activé) vider le tableau $ _GET dans test.php. Si cela fonctionne, remplissez les codesforks avec vos vraies instructions de configuration.

+0

Très belle trouvaille, merci! – ciscoheat