2011-09-07 14 views
11

Zastanawiam się, czy możliwe było ustawienie warunkowego warunku autoryzacji http bazującego na adresie URL hosta wirtualnego w pliku .htaccess..htaccess podstawowy autoryzowany przez wirtualnego hosta?

Na przykład chcę, aby mysite.com i test.mysite.com były uruchamiane z tej samej bazy kodu w tym samym katalogu, ale chronią hasłem test.mysite.com. Zostałby skonfigurowany w ten sposób, aby nie potrzebować rozgałęziać mojego kodu, ponieważ mój kod aplikacji może zobaczyć, z którego vhost/url jest obsługiwany i wybrać bazę danych do obsługi zawartości.

Odpowiedz

19

Możesz sortować to za pomocą mod_setenvif wraz z modułami mod_auth. Użyj dyrektywy SetEnvIfNoCase, aby ustawić, który host jest chroniony hasłem. Musisz kilka dodatkowych dyrektyw w celu zaspokojenia dostępu:

# Check for the hostname here 
SetEnvIfNoCase HOST ^test\.mysite\.com\.?(:80)?$ PROTECTED_HOST 

Następnie wewnątrz bloku Directory (lub tylko w otwartym terenie) masz konfigurację auth rzeczy, coś takiego:

AuthUserFile /var/www/test.mysite.com/htpasswd 
AuthType Basic 
AuthName "Password Protected" 

teraz dla wymagających/zaspokoić rzeczy:

Order Deny,Allow 
Satisfy any 
Deny from all 
Require valid-user 
Allow from env=!PROTECTED_HOST 

uczyni go więc każdy gospodarz, który nie pasuje ^test\.mysite\.com\.?(:80)?$ będą mieli dostęp bez potrzeby uwierzytelniania (Allow from env=!PROTECTED_HOST), ale poza tym potrzebujemy poprawnego użytkownika (Require valid-user). Model Satisfy any zapewnia, że ​​potrzebujemy tylko jednego z dwóch elementów: Zezwól lub Wymagaj.

+0

Próbuję aktywować przypadek warunkowy, ale należy użyć , aby go przetestować, ale nie działa. Jakieś pomysły? Używam: SetEnvIfNoCase Host "dev.example.com" DEV ... a następnie dla przypadku "dev" i dla "zwykłej" witryny ... – DM8

+0

@ DM8 To nie jest to, co [] robi (http://httpd.apache.org/docs/2.2/mod/core.html#ifdefine). Te zmienne są ustawiane przez flagę linii komend '-D'. Nie są zmiennymi środowiskowymi. –

+0

hmm, wtedy oprócz czekania na uaktualnienie mojego hosta do Apache 2.4 (który ma blok ...). Czy istnieje sposób na zachowanie, na które liczyłem? ... w moich poszukiwaniach znalazłem następujący artykuł, który wydaje się wskazywać, że nie ma sposobu na zrobienie tego w Apache 2.2x: http: //turboflash.wordpress.com/2010/05/27/apache-environment-variables-visibility-with-setenv-setenvif-and-rewriterule-directives/ – DM8

5

Oto rozwiązanie podobne do tego co proponuje Jon Lin, ale przy użyciu RewriteCond sprawdzić nazwę hosta:

RewriteEngine On 
RewriteCond %{HTTP_HOST} =protected.hostname.com 
RewriteRule ^.*$ - [E=DENY:1] 

AuthUserFile /path/to/htpasswd 
AuthName "Password please" 
AuthType Basic 

Order Deny,Allow 
Satisfy any 
Deny from all 
Require valid-user 
Allow from env=!DENY 
12

miałem problemy wykonawcze rozwiązanie Jona: Chociaż jestem dość obeznany z konf Apache i wyrażeń regularnych, uwierzytelnianie zawsze było wyzwalane. Od szybkie analiz wyglądało linii Allow from env=!PROTECTED_HOST nie kopać w

Ale znalazłem inne rozwiązanie, które faktycznie wygląda bezpieczniej dla mnie.

Stworzyłem dwa wirtualne hosty dla dwóch domen wskazujących na tego samego korzenia dokumentu (co jest w pełni dozwolone w drodze). W jednym z vhostów dodałem dyrektywy dotyczące podstawowego auth (bezpośrednio do bloku dyrektyw vhost).

Działa jak urok. I mam lepsze przeczucie, że jest to naprawdę bezpieczne - bez ryzyka pominięcia jakichkolwiek szczegółów w schemacie regex, który otworzyłby bramy dla intruzów.

<VirtualHost *:80> 
    ServerName www.mysite.com 
    DocumentRoot "/path/to/common/doc/root" 

    <Directory "/path/to/common/doc/root"> 
     Options Indexes FollowSymLinks 
     AllowOverride All 
     Order allow,deny 
     Allow from all 
    </Directory> 
</VirtualHost> 

<VirtualHost *:80> 
    ServerName protected.mysite.com 
    DocumentRoot "/path/to/common/doc/root" 

    <Directory "/path/to/common/doc/root"> 
     Options Indexes FollowSymLinks 
     AllowOverride All 
     Order allow,deny 
     Allow from all 

     AuthUserFile /path/to/htpasswd 
     AuthName "Password please" 
     AuthType Basic 
     Require valid-user 
    </Directory> 
</VirtualHost> 
+2

To jest ** prawo ** sposób to zrobić. Jeśli potrzebujesz 2 vhostów do skonfigurowania w inny sposób, skonfiguruj 2 vhosty. Zwykłe rozwiązanie z env var i 'satisf each" powinno być stosowane tylko jeśli hostujesz, nie dajesz dostępu do konfiguracji vhost/server i pozostaje ci rozwiązanie .htaccess. –

Powiązane problemy