2010-11-01 17 views
19

Wir haben lokale Server, zentrale Dev-, Staging- und Produktionsserver. Der Entwickler und das Staging sind jedoch aus offensichtlichen Gründen passwortgeschützt. Nach der Implementierung von Änderungen an htaccess muss ich die htaccess-Datei manuell bearbeiten, um den Passwortschutz auf dem Dev- und Staging-Server zu aktivieren.Domänennamensspezifische Codeblöcke in htaccess

Gibt es eine Möglichkeit bedingte Blöcke zu haben, basierend auf Domain-Namen wie:

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

ich die .htaccess-Äquivalent der Bedingung finden müssen:

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

} 

Ich würde die jede Hilfe dankbar oder Hinweise, die ihr geben könnt.

Antwort

28

Während es durch die Virtualhost tun und kein .htaccess ist viel besser, können Sie die folgende Lösung verwenden, wenn das SetEnvIf Modul aktiv ist:

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 

Sie es auch mit einer weißen Liste tun könnte, was wahrscheinlich ist, besser, da es sorgt für Ihre dev Websites auch noch geschützt sind, wenn jemand Zugang zu ihnen zu ermöglichen, entscheidet über 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 

wenn Sie nicht mod_setenvif auf Ihrem Server haben, mod_rewrite können auch Mach die Arbeit für dich (ersetze die SetEnvIf Blöcke in das weiße Liste Beispiel mit dem folgenden):

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

Nur ein Kopf über die Sicherheit: HTTP_HOST wird vom Client zur Verfügung gestellt und ist spoofable. Außerdem werden einige Proxies den Wert streichen, so dass Sie sich nicht einmal darauf verlassen können, dass er vorhanden ist. Sie sollten SERVER_NAME verwenden, das vom Server bereitgestellt wird. – Andri

+3

Wenn Namen-basierte virtuelle Hosts beteiligt sind, glaube ich nicht, dass HTTP_HOST spoofable ist.Oder genauer gesagt, es ist natürlich spoofable, aber dann wird die Anfrage nie ihr beabsichtigtes Ziel erreichen. – ThiefMaster

+0

Also, wenn die Anfrage mit einem HTTP_HOST kommt, der keinem der virtuellen Hosts entspricht, geht es einfach nirgendwohin? – Andri

1

Sie sollten in Ihren Websites conf Datei tun dies mit:

<VirtualHost domain.com:80> 

...config statements here 

</VirtualHost> 

und

<VirtualHost domain2.com:80> 

....config statements here 

</VirtualHost> 

Wenn Sie mit einem Host, den Sie nicht erlauben, Ihre Websites config-Datei zu bearbeiten, das ist eine echte Möglichkeit, wenn Sie mit einem geteilten Host sind, dann sollten Sie VPS oder dediziertes Hosting in Erwägung ziehen.

+1

Ich kann dies tun, aber ich möchte nicht, dass die Änderungen über alle Server. Ich bin faul! :) –

5

fand ich eine schöne Lösung, „localhost“ vs. „live“ zu unterscheiden: etwas eingeschränkt

Da das conditionals von .htaccess, warum für IfModule nicht zufrieden geben? : Vergleichen Sie die Module, die Sie haben (dh verwenden und nach einem signifikanten, hoffentlich langfristigen Unterschied suchen, z. Wenn Sie unter Windows entwickeln und auf Linux bereitstellen, kann mod_win32.c gut sein. (Vergessen Sie nicht die .c die phpinfo() ommits hinzuzufügen.)

Dann Sie es so gehen kann (getestet):

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

Dieses Beispiel macht für eine gute geistige Gesundheit Test, browing zu deiner Domain/Banane bzw. localhost/banana und wenn Sie (mit der Umschreibfunktion aktiviert) das Array $ _GET in der Datei test.php ablegen. Wenn dies funktioniert, füllen Sie die Codeforks mit Ihren echten Konfigurationsanweisungen.

+0

Sehr schöne Entdeckung, danke! – ciscoheat