2012-10-14 2 views
13

이전에 비슷한 질문을했지만 내 상황에 대한 구체적인 답변을 찾지 못했습니다. 여러 환경의 .htaccess

나는 여러 환경 (로컬, 개발, 생산)에서 실행되는 ExpressionEngine 사이트를 가지고 있고, 이러한 환경의 각각 다른 htaccess로 규칙이 필요 :

모든 환경

개발

  • 비밀번호 .htpasswd
  • 강제 HTTPS 프로토콜을 보호
  • X-Robots-Tag

생산과

  • 방지 검색 엔진 색인

    • 강제 HTTPS 프로토콜

      • 없음 독특한 규칙이

      지역 WWW에

    • 리디렉션 www가 아닌 ​​하위 도메인을.

    모듈별로 특정 환경을 설정하는 방법에 대한 많은 예제를 보았습니다. mod_rewrite 모듈에는 RewriteCond %{REQUEST_HOST} ^dev.myurl.com, .htpasswd 요구 사항에는 tricks like this이 있습니다.

    하지만 실제로 환경 전역 변수를 설정 한 다음 환경별로 .htaccess 파일에서 해당 변수를 다시 사용하는 것이 좋습니다. 예를 들어 의사 자바 스크립트를 사용하려면, 무엇인가 :

    var local = 'mysite.local'; 
    var development = 'dev.mysite.com'; 
    var production = 'www.mysite.com'; 
    
    // Global .htaccess rules 
    
    if(environment == local){ 
        // Local environment .htaccess rules 
    } 
    
    if(environment == development){ 
        // Development environment .htaccess rules 
    } 
    
    if(environment == production){ 
        //Production envirotnment .htaccess rules 
    } 
    

    이 방법 환경 관련 모든 규칙이 모두 정말 깨끗한 파일을 함께 그룹화하고, 하나의 변수가 요구하는 환경 경우 변경 될 수 있습니다 변경됩니다.

    아파치 구성 파일의 설정을 변경하는 방법에 대한 몇 가지 참조를 보았습니다.하지만 제 3 자 호스트를 다루는 경우에는 실행 가능한 옵션이 아닙니다.

    하늘의 희망찬 생각 이니, 그렇게 할 수 있습니까?

  • +0

    내가 건너 온 [이 문서] (http://www.thenerdary.net/post/20965499862/htaccess-environments), 아직 시도하지는 않았지만 유망 해 보입니다. – kgrote

    답변

    8

    하늘의 희망찬 생각은 그렇게 할 수 있습니까, 아니면 끝낼 수 있습니까?

    IMO, 예. ENV 변수 또는 그와 비슷한 것을 기반으로 규칙을 예측 가능한 "범위 지정"할 수는 없습니다.아파치에 임의의 if(something) { do everything in here }이 존재하지 않습니다. 많은 지시문이 특정 범위 내에서는 작동하지 않으며 나중에는 무언가가 어떻게 작동 하는지를 변경해야 할 때 단순히 수정하는 것보다 자신이 가진 것을 깨뜨릴 가능성이 더 큽니다.

    가장 좋은 방법은 not use htaccess files at all하는 것입니다

    당신은 메인 서버 구성 파일을 httpd가에 액세스 할 수있는 경우 완전히 .htaccess 파일을 사용하지 않아야합니다. .htaccess 파일을 사용하면 Apache http 서버 속도가 느려집니다. .htaccess 파일에 포함 할 수있는 지시문은 Directory 블록에서 더 잘 설정됩니다. 더 나은 성능으로 동일한 효과를 갖기 때문입니다.

    로컬, dev 및 프로덕션을위한 별도의 가상 호스트를 만듭니다. 필요에 따라 구성 요소를 공유하거나 다른 구성 요소를 공유하거나 (global.includes 파일과 같은) 다른 위치에 저장 한 다음 3 개의 가상 호스트 모두에서 Include 지시어를 사용하십시오. 특정 디렉토리에 규칙을 적용해야하는 경우 htaccess 파일 대신 <Directory> 블록을 사용하십시오.

    htaccess 파일에 모든 것을 넣으려면 이겠지만 모든 것을 넣으십시오. 질문에 의사 코드와 가장 가까운 것은 아마도 in <IfDefine> blocks입니다. 기본적으로 같은 : 당신이 아파치를 시작할 때

    # Global htaccess rules 
    RewriteEngine On 
    RewriteRule ^foo$ /bar [L] 
    
    # Only local 
    <IfDefine LocalInstance> 
        RewriteRule ^local/foo /bar [L] 
    </IfDefine> 
    
    # Only dev 
    <IfDefine DevInstance> 
        RewriteRule ^dev/foo /bar [L] 
    </IfDefine> 
    
    # Only production 
    <IfDefine ProductionInstance> 
        RewriteRule ^dev/foo /bar [L] 
    </IfDefine> 
    

    그런 다음, 당신은 당신의 가상 호스트 설정 어딘가에서 (하나 개의 인수)를 Define 지시어를 사용하여, -DLocalInstance-DDevInstance, 또는 명령 줄 paramaeters로 -DProductionInstance 또는 전달해야 것 . 이것은 마치 정상적으로 작동하는 것이 보장되지 않습니다. 이전에 <IfDefine>으로 설명 할 수없는 문제에 부딪 혔습니다. 특히 너무 상상해보십시오.

    +2

    아파치 웹 서버 v2.4에서 향상된 핵심 기능 중 하나는 ', 섹션을 사용하여 요청 기준에 따라 구성을 설정할 수 있습니다.'사용하고자하는 것이 디렉토리 컨텍스트를 지원하는 한. http://httpd.apache.org/docs/trunk/mod/core.html#if –

    10

    존의 대답은 좋은 것입니다. 불행히도, 모든 웹 호스트가 아파치를 시작하기위한 -D 매개 변수를 제어 할 수있는 것은 아닙니다. 여기

    dev에 생산에 하나의 htaccess로 파일을 사용하는 방법,하지만 dev에 사이트 암호로 보호 있습니다

    # ---------------------------------------------------------------------- 
    # Password protect staging server 
    # Use one .htaccess file across multiple environments 
    # (e.g. local, dev, staging, production) 
    # but only password protect a specific environment. 
    # ---------------------------------------------------------------------- 
    
    SetEnvIf Host staging.domain.com passreq 
    AuthType Basic 
    AuthName "Password Required" 
    AuthUserFile /full/path/to/.htpasswd 
    Require valid-user 
    Order allow,deny 
    Allow from all 
    Deny from env=passreq 
    Satisfy any 
    
    관련 문제