2011-09-07 1 views
11

.htaccess 파일의 가상 호스트 URL을 기반으로 조건부 HTTP 기본 인증 요구 사항을 설정할 수 있는지 궁금합니다.가상 호스트별로 .htaccess 기본 인증?

예를 들어 mysite.com과 test.mysite.com이 동일한 디렉토리에서 동일한 코드 기반을 실행하지만 password는 test.mysite.com을 보호하도록하고 싶습니다. 이 방법을 사용하면 코드를 분기 할 필요가 없으므로 내 응용 프로그램 코드에서 제공되는 vhost/url을 볼 수 있으므로 콘텐츠를 제공 할 데이터베이스를 선택할 수 있습니다.

답변

19

모듈과 함께 mod_setenvif을 사용하여 kludge를 정렬 할 수 있습니다. 암호로 보호 된 호스트를 설정하려면 SetEnvIfNoCase 지시문을 사용하십시오.

AuthUserFile /var/www/test.mysite.com/htpasswd 
AuthType Basic 
AuthName "Password Protected" 
:이 같은 당신의 인증 물건의 설정을 가지고 (오픈에서 그냥 나)에 Directory 블록 내부에 다음

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

: 당신은 액세스를 충족하기 위해 추가 지침의 몇 가지가 필요합니다

이제 만족 /이 필요한 물건 :

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

이 그것을 만들 것 때문에 인증에 대한 필요없이 액세스 할 수 있습니다 ^test\.mysite\.com\.?(:80)?$ 일치하지 않는 모든 호스트 () 그렇지 않으면 유효한 사용자 (Require valid-user)가 필요합니다. Satisfy any은 2 중 하나만 허용하거나 필요로하는지 확인합니다.

+0

조건부 사례를 활성화하려고 시도했지만 테스트하려면 을 사용하지만 작동하지 않습니다. 어떤 아이디어? .. 사용하고 있습니다 : SetEnvIfNoCase 호스트 "dev.example.com"DEV ... 그리고 나서 'dev'의 경우 및 '일반'사이트의 경우 ... – DM8

+0

@ DM8 그게 [ 않습니다] (http://httpd.apache.org/docs/2.2/mod/core.html#ifdefine) 않습니다. 이러한 변수는'-D' 명령 행 플래그에 의해 설정됩니다. 환경 변수가 아닙니다. –

+0

흠, 그렇다면 내 호스트가 아파치 2.4로 업그레이드하기를 기다리는 것과는 별개로 (이것은 블록을 가지고 있습니다 ...). 내가 원하는 행동을 취할 수있는 방법이 있습니까? ... 내 검색에서 아파치 2.2x : http : //turboflash.wordpress에서 이것을하는 _no_ 방법이 있음을 나타내는 다음 기사를 발견했다.com/2010/05/27/apache-environment-variables-visibility-with-setenv-setenvif-and-rewriterule-directives/ – DM8

5

여기 존 린은 제안 된 것과 유사한 솔루션,하지만 RewriteCond를 사용하여 호스트 이름 확인 :

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

을 내가했다 존의 솔루션을 구현 문제 : 제가 아파치의 conf의 정규 표현식에 매우 익숙하지만, 인증은 항상 해고되었습니다. . 빠른에서가에 걷어차하지 않은 Allow from env=!PROTECTED_HOST 라인처럼 보였다

분석하지만 실제로 나에게 더 안전한 보이는 다른 해결책을 발견 : 나는 같은 문서 루트를 가리키는 두 도메인에 대해 두 개의 가상 호스트를 생성

을 (도중에 완전히 허용됨). vhosts 중 하나에서 기본 인증 (직접 vhost 지시문 블록)에 대한 지시문을 추가했습니다.

매력처럼 작동합니다. 그리고 나는 이것이 정말로 안전하다는 더 나은 느낌을 가지고 있습니다. 침입자를위한 문을 열어 줄 정규식 패턴의 세부 사항을 간과 할 위험이 없습니다.

<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

이것이 올바른 방법입니다 **. 2 개의 가상 호스트를 다르게 구성해야하는 경우 2 개의 가상 호스트를 구성합니다. env var 및'satisf any'를 사용하는 해킹 된 솔루션은 호스팅 할 때 vhost/server config에 액세스 할 수 없으며 .htaccess 솔루션이 남아있는 경우에만 실제로 적용되어야합니다. –