2009-08-31 10 views
8

Mam kilka witryn: example.com, example1.com i example2.com. Wszystkie wskazują na katalog mojego serwera /public_html, który jest moim folderem głównym Apache.Skorzystaj z uwierzytelniania HTTP tylko w przypadku dostępu do określonej domeny

Co muszę dodać do mojego pliku .htaccess, aby używać uwierzytelniania http tylko, jeśli użytkownik pochodzi z domeny example2.com? example.com i example1.com NIE powinny używać uwierzytelniania.

Wiem, że muszę coś podobnego

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

Ale chcę tylko wymaga hasła, gdy użytkownik odwiedza example2.com.

Edit

Stosując podejście sugeruje odpowiedź, mam następujących w moim pliku .htaccess:

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

wiem, że moduł mod_setenvif.c jest włączona (I zweryfikowane < IfModule> blok), ale wydaje się, że "testauth" nigdy nie zostanie zdefiniowany, ponieważ mój test do weryfikacji (przekierowanie do index2.php) nie jest wykonywany (podczas gdy był on wykonywany w moim bloku < IfModule>). Jakieś pomysły, dlaczego?

+0

Jeśli wszystkie domeny są wskazując na to samo miejsce, dlaczego chcesz chronić tylko jedną z nich? Jeśli faktycznie wyświetlasz różne treści, dlaczego nie zastosować bardziej rygorystycznego podejścia, takiego jak jeden folder w domenie? –

+0

Używam wielopunktowej instalacji Drupala z folderu my/public_html i chcę utworzyć pełny adres http na jednej z witryn, oprócz zwykłego loginu użytkownika tej witryny. –

+0

Multisite Drupala pozwala mi uruchamiać różne witryny internetowe z tego samego zestawu plików PHP, ale z różnymi bazami danych (tak różne treści). Mogłem wykonać drugą instalację w podfolderze, ale to wymagałoby ode mnie zachowania odrębnych zestawów plików i modułów. –

Odpowiedz

1

Nie powinieneś umieszczać konfiguracji per-vhost w .htaccess. Zamiast tego umieść blok konfiguracji w bloku VirtualHost w odpowiednim pliku konfiguracyjnym w /etc/apache/sites-enabled/*.

+0

Niestety nie mam dostępu do plików vhost. Używam tego wszystkiego na współdzielonym serwerze hostingowym przez CPanel. = ( –

2

Zastanawiam się, czy DanH otrzyma pomoc w podejściu umożliwiającym dostęp na adres IP?

Coś

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 

a następnie w Drupal "pojemnik"

Order Allow,Deny 
Allow from env=AllowMeIn 

powinno załatwić sprawę.

Każdy host, który jest "na żywo" powinien być skonfigurowany do "AllowMeIn", lub musisz pochodzić ze znanego adresu IP (tj. Ty i inni programiści).

+0

Idealne działa dzięki przyzna w ciągu 4 godzin – DanH

16

Jak o czymś na wzór tego w pliku .htaccess w katalogu głównym dokumentu:

# 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 

uczyni to tak uwierzytelnianie nie jest wymagane, chyba że gospodarz kończy example2.com (np www.example2.com, dev.example2.com, etc). W razie potrzeby wyrażenie można zmodyfikować. Dowolny inny host spowoduje, że zmienna require_auth nie zostanie ustawiona, dlatego wymagane jest uwierzytelnienie , a nie. Jeśli to musi być odwrotnie, ostatnią linię można zmienić na: Allow from env=require_auth, usuwając !.

+2

Dla mnie require_auth nie działa, ale to robi:! Pozwól ze wszystkich Deny od env = require_auth Require valid-użytkownika zaspokoić wszelkie –

+0

Dziękuję bardzo –

+0

Użytkownicy afaik mogą to wykorzystać, prosząc o "example2.com." (Zauważ kropkę na końcu), więc twoja reguła powinna raczej być 'SetEnvIfNoCase Host example2 \ .com \.? $ ...' inaczej treść może być nadal widoczny bez ochrony. – Matmarbon

5

Oto jeden zalecenie:

Utwórz plik o nazwie common.conf i zapisać w miejscu dostępnym

W tym miejscu pliku konfiguracji Apache wspólny dla wszystkich stron (gospodarze).

Remove aktualny pojedynczy wpis VirtualHost zastąpić wpisami virtualhost następująco:

# 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 oferuje semantyczne alternatywę z dyrektywą If:

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