Http 호스트를 기반으로 변수를 설정하기 위해 SetEnvIf를 어떻게 사용할 수 있습니까?


11

Apache에서 변수를 설정하려고합니다.

http 호스트가 dev URL 인 경우 ENV = DEV

또는

http 호스트가 prd URL 인 경우 ENV = PRD

그런 다음 $ _SERVER [ 'ENV']를 사용하여 논리 분기를 만듭니다.

지금까지 이들 중 어느 것도 나를 위해 일한 적이 없으며 setenvif 모듈이 설치되어 있습니다.

SetEnvIfNoCase Referer
SetEnvIfNoCase Remote_Host

이것을하는 올바른 방법은 무엇입니까?

답변:


15

설명서를 간단히 살펴보십시오 .

SetEnvIf 지시문은 요청의 속성을 기반으로 환경 변수를 정의합니다. 첫 번째 인수에 지정된 속성은 다음 세 가지 중 하나 일 수 있습니다.

HTTP 요청 헤더 필드 (자세한 내용은 RFC2616 참조); 예 : 호스트, 사용자 에이전트, 참조 자 및 수락 언어 요청 헤더 세트를 지정하는 데 정규식을 사용할 수 있습니다.

따라서 Host헤더 에서 환경 변수를 조건부로 만들 수 있습니다 . 당신이 중 하나를 사용하려고하는 것 같습니다 Referer또는 Remote_Host(이론적으로하지만, 정확하게 당신이 원하는 무엇 헤더, 어느 쪽도 아니 Referer의 값이 포함되어야 Host대부분의 경우 헤더). 요청 Remote_Host을하는 클라이언트 의 호스트 이름이 될 것입니다. 원하는 것은 아닙니다 (성능상의 이유로 DNS 조회를 끄는 것이 일반적이기 때문에 대부분의 구성에서는 사용할 수 없습니다).

다음과 같이 해보십시오 :

SetEnvIf Host "www-dev\.example\.com" ENV=DEV
SetEnvIf Host "www-production\.example\.com" ENV=PRD

... $ _ SERVER [ 'ENV']를 사용하여 논리 분기를 만듭니다.

그러나이 Hostchicanery를 거치지 않고 PHP에서 직접 헤더 값을 직접 참조 할 수 있습니다 . $_SERVER['HTTP_HOST']정확히 당신이 원하는 것을 가질 것입니다.


아름다운. 이를 통해 특정 호스트에 연결할 때 암호가 필요한 사용자 지정 규칙을 작성할 수 있지만 다른 호스트에는 그렇지 않습니다 (예 : 하나의 VM이 여러 Amazon EC2 인스턴스에 복제 될 때 준비 상자를 보호하지만 사용자 정의 Chef 레시피는 작성하지 않음). 검색하기 어려운 경우 기능이 매우 유용합니다.
— Eric L.

1
SetEnvIf문서는 3 PARAM 도메인 이름에 점은 백 슬래시로 이스케이프 안 정규식이라고 말? 아니면 큰 따옴표로 값을 인용하면 Apache가 문자열 리터럴로 취급합니까?
— jakub.g

@ jakub.g 네, 정규 표현식이므로 탈출해야합니다. 이 경우 점은 단일 문자와 일치하므로 "www-dev.example.com"정규 표현식은 예기치 않은 호스트 이름 (예 :) 과도 일치 www-dev-example.com합니다. 예상되는 경기 등을 얻을 수 있습니다. 예를 지금 업데이트했습니다.
— Martijn Heemels
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.