httpd.conf 변수 : $ {var}와 % {var}의 차이점은 무엇입니까?


7

httpd.conf ${var}와 차이점은 무엇입니까 %{var}?

어떻게 하나가 될 때 사용하는 것이 ${}%{}?

http://httpd.apache.org/docs/2.4/configuring.html 언급 :

$ {VAR} 구문을 사용하여 구성 파일 행에서 Define 또는 shell 환경 변수로 정의 된 변수 값을 사용할 수 있습니다.

http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html 언급 :

서버 변수 : % {NAME_OF_VARIABLE} 형식의 변수입니다.

RewriteMap 확장 : $ {mapname : key | default} 형식의 확장입니다.

${VAR}mod_rewrite의 지시어의를 제외하고, httpd.conf를 어디에서나 사용 (한다 RewriteCond, RewriteRule의 같은 있지만, 이는 사용한다 RewriteMap 확장을 제외 할 ${}같이 /(.*한다 RewriteRule ^ / 예) $ {examplemap : $ 1} )

SetEnvIf지시문을 사용 하여 httpd.conf에 설정된 변수 를 동일한 httpd.conf에서 사용하기 위해 ${var}mod_rewrite 지시문과 함께 사용하는 경우 를 제외하고 변수를 사용 %{var}합니까?

답변:


5

httpd.conf에서 $ {var}와 % {var}의 차이점은 무엇입니까?

거의 모든 것. 어디에서 어떻게 사용 하느냐에 따라 다른 일을하기 때문에 " $x를 %수행하고 y를 수행한다"라는 단단하고 빠른 규칙은 없습니다 .

mod_rewrite 지시문을 제외하고 $ {VAR}은 httpd.conf의 모든 곳에서 사용됩니까?

아니오 -mod_rewrite 관련 행에서도 구성 전체의 모든 위치에서 ${VAR}대체로 적용됩니다 . httpd 바이너리에 전달 된 옵션 또는 지시문 을 사용하여 시작시에만 정의 할 수 있습니다 .-DDefine

변수에는 :문자가 포함되어서는 안되며 RewriteMap사용법에는 문자가 포함되어야하기 때문에이 작업을 수행 할 수 있습니다 :. 이렇게하면 $충돌없이 매우 다른 방식으로를 사용할 수 있습니다. 파서는이를보고 :대체하지 않아야한다는 것을 알고 있습니다.

동일한 httpd.conf에서 사용하기 위해 SetEnvIf 지시문을 사용하여 httpd.conf에 설정된 변수를 변수가 mod_rewrite 지시문과 함께 사용될 때를 제외하고 $ {var}로 사용됩니까? 변수는 % {var}로 사용됩니까?

제 환경 변수는 변수를 통해 설정과 동일하지 않습니다 -D또는 Define- 그들은 완전히 분리 당 요청 문맥 (사람들은 그들에게 함께있을 설정되어있어 SetEnvIf), 특정 지시어를 사용하는 것이다. 그것들은 지원되는 곳에서 mod_rewrite, 그들이 사용하는 %{ENV:variable}로그 에서 언급되며 %{variable}e, 많은 지시문에는 논리 검사가 env=variable있습니다.


그래서 기본적으로; 지난 수십 년 동안 웹 서버의 역사를 보여주는 혼란스러운 혼란입니다. 아마도 혼동하는 주된 것은 mod_rewrite의 구문이 어떤 식 으로든 구성의 다른 부분으로 확장되지 않는다는 것입니다. 다 다릅니다. 이 모든 것에서 취해야 할 요점은이 모든 것을 이해하기위한 지배적 인 '규칙'이 $없다는 것입니다. 한 지점 $에서 다른 지점 과는 완전히 다른 것을 의미합니다 .

몇 가지 편리한 참조 점 :

  1. 당신은 아파치가 사용을 시작할 때 정적 변수를 설정하고자하는 경우 Define${VAR}아파치의 시작에 한 번 교체하십시오. 이는 개발 환경과 프로덕션 환경간에 구성 파일 공유와 같은 작업을 수행하려는 경우에 유용하지만 항상을 포함하는 $from 사용과 혼동해서는 안됩니다 .RewriteMap:
  2. 특정 요청에서 변수로 작업하려는 경우 환경 변수가 뒤 따릅니다. 그러나 특정 지시문과 함께 사용될 때 변수를 얻는 데 사용할 구문에 대해 가정 할 수는 없습니다. 해당 지침에 대한 설명서를 확인해야합니다.
  3. mod_rewrite에 문제가 있으면 변수와 구문에 대해 생각한 모든 것을 버리십시오. 에 자체 변수 세트가 있으며을 사용 %{VAR}하여 '일반'환경 변수를 얻을 수 있으며을 사용하여 환경 변수를 %{ENV:VAR}설정할 수 있습니다 [E=VAR].

와! 긴 쓰기에 감사드립니다! 이것을 소화하는 데 시간이 좀 걸릴 것입니다. 아파치 문서가 이것을 한곳에서 문서화하지 않는다는 것은 매우 이상합니다. 많은 초보자에게는 혼란 스럽습니다.
X10

예-문서는 특정 개념에 나쁘지 않지만 이와 같은 '큰 그림'은 명확하지 않습니다.
Shane Madden

1

mod_rewrite의 소스 코드를 살펴보고 주석에서 메모를 발견했습니다 (do_expand 함수).

        /* variable lookup */
        else if (*p == '%') {
        ...
        /* map lookup */
        else {     /* *p == '$' */

따라서 %는 정확한 변수를위한 것이고 $는 해시 테이블 ( "맵")을 찾는 것입니다. 또한 모든 mod_rewrite 확장은 코어 자체와 완전히 독립적입니다. 전체 확장은 모듈 자체에서 수행됩니다.

나는 이전에 생각했지만 잘못되었습니다.

$ {} vars는 프로젝트 환경을 사용하며 구성 구문 분석시 평가됩니다.

% {} vars는 요청 환경을 사용하며 요청이 구문 분석 될 때 평가됩니다. mod_rewrite는 % {} symantic을 사용하여 httpd core에서 구성 시간 보간을 방지합니다.


감사합니다. 원본 문서에 대한 링크를 포함하고 가능한 경우 튜토리얼에 대한 링크를 포함시켜 주시겠습니까?
X10

나는 문서에서 그것을 분명한 텍스트로 본 적이 없다. 그것이 내가 왜 그런지를 이해 한 방법입니다. 그리고 그것은 틀렸다 :)
datacompboy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.