Apache httpd 2.4에 여러 개의 동일한 디렉토리 지시문에 대한 약어가 있습니까?

Apache httpd 2.4에 여러 개의 동일한 디렉토리 지시문에 대한 약어가 있습니까?

이것은 아파치 httpd 2.4입니다.

이전 설치를 2.2에서 2.4로 포팅하려고 하며 그 과정에서 약간 정리합니다. 동일한 설정을 가진 많은 디렉토리가 있으며 그 사이에 몇 가지 다른 디렉토리가 흩어져 있습니다. 기본적으로 다음과 같습니다.

<directory /var/www/aaa >
  # lots of stuff
</directory>
<directory /var/www/bbb >
  # lots of stuff
</directory>
<directory /var/www/ >
  # lots of stuff
</directory>
<directory /var/www/ccc >
  # lots of other stuff
</directory>

추가 줄을 피하고 싶기 때문에 다음과 같은 일종의 속기를 사용하고 싶습니다.

<directory /var/www/aaa >
<directory /var/www/bbb >
<directory /var/www/ >
  # lots of stuff
</directory>

<directory /var/www/ccc >
  # lots of other stuff
</directory>

하지만 <Directory>내가 찾을 수 있는 어떤 방식으로든 여러 디렉터리를 지원하지 않습니다. 따라서 <DirectoryMatch>다음과 같이 적절해 보입니다.

<directoryMatch /var/www/(aaa|bbb|) >
  # lots of stuff
</directory>

<directoryMatch /var/www/ccc >
  # lots of other stuff
</directory>

/var/www/(aaa|bbb|)일치가 불완전하기 때문에 실패합니다 /var/www/ccc. 대조적으로 <Directory>, <DirectoryMatch>디렉토리 구성요소는 가장 짧은 것부터 가장 긴 것 순으로 처리되지 않습니다. 매뉴얼에서는 "각 그룹 내에서 섹션이 구성 파일에 나타나는 순서대로 처리됩니다"라고 주장하지만 섹션을 전환하더라도 결과는 여전히 동일합니다(예: /var/www/ccc" " 대신 " "으로 표시됨). .# lots of stuff# lots of other stuff

이 예에서는 물론 regexp( /var/www/(aaa|bbb|(?!ccc)))를 확장할 수 있지만 불행히도 실제 구성은 그보다 훨씬 더 복잡합니다. 정규식을 사용하면 여전히 가능할 수 있지만 결과를 이해하거나 유지하기 어려울 수 있습니다.

그렇다면 DirectoryMatch 외에 이 작업을 수행할 수 있는 다른 방법이 있습니까? 누구든지 나에게 힌트를 줄 수 있습니까? Apache가 위의 부분 일치를 선호하는 이유를 설명해 주시겠습니까? 감사해요.

답변1

, , 및 DirectoryMatch모두 일치 하지만 일치하지 않는 읽기 쉬운 방법은 없습니다 . 이는 다른 세 개의 디렉토리가 모두 포함되어 있기 때문입니다./var/www/aaa/var/www/bbb/var/www/var/www/ccc/var/www

아마도 사용하는 것이 더 쉬울 것입니다.모드 매크로구성의 공통 부분을 정의하고 Directory원래 예와 같이 적용합니다.

a2enmod macro                # Enable the mod_macro module
systemctl restart apache2    # YMMV but this is the systemd way

그런 다음 매크로를 정의할 수 있습니다. 이것이 내가 사용하는 것입니다

# Logging
#
<Macro CronoLogger $vHost>
    ServerSignature On
    LogLevel warn
    ErrorLog "|/usr/bin/cronolog /home/www/$vHost/logs/%Y/%m/%d/public-error.log"
    CustomLog "|/usr/bin/cronolog /home/www/$vHost/logs/%Y/%m/%d/public-access.log" combined
</Macro>

다음과 같이 vHost 정의에 포함합니다.

Use CronoLogger www.contoso.com

귀하의 경우 예제 매크로를 사용하면 StandardStuff param1 param2다음과 같이 사용할 수 있습니다

<Directory /var/www>
    Use StandardStuff /var/www /
</Directory>

<Directory /var/www/aaa>
    Use StandardStuff /var/www /aaa
</Directory>

<Directory /var/www/bbb>
    Use StandardStuff /var/www /bbb
</Directory>

<Directory /var/www/ccc>
    # Do non-standard stuff here
    #
</Directory>

답변2

수동에서는 "각 그룹 내에서 섹션이 구성 파일에 나타나는 순서대로 처리됩니다"라고 주장하지만 섹션을 전환해도 결과는 여전히 동일합니다(/var/www/ccc는 "# "#다른 많은 것" 대신에 " ) 많은 것").

두 명령어가 일치하면 둘 다 처리됩니다.

mod_headers( )를 활성화 a2enmod headers하고 시도해 보세요.

<DirectoryMatch /var/www/(aaa|bbb|)>
    Header add AAA one
</DirectoryMatch>
<DirectoryMatch /var/www/ccc>
    Header add AAA two
</DirectoryMatch>

개발자 도구를 사용하여 표시되는 응답에는 http://localhost/ccc두 개의 헤더가 포함되어 있습니다.

/var/www, /var/www/foo.html, /var/www/aaa /var/www/aaa/bar, /var/www/bbb를 일치시키려면 /var/www/bbb/baz다음이 작동해야 합니다.

<DirectoryMatch ^/var/www/([^/]*|aaa/.*|bbb/.*)$>
  • [^/]*/var/www/디렉토리가 아닌 모든 것과 일치합니다 .
  • aaa/.*|bbb/.*하위 디렉터리를 포함하여 내부의 모든 항목과 일치합니다.
  • $여기서 중요합니다. 그렇지 않으면 정규식은 디렉토리의 시작 부분과 일치하도록 정의되고 원하는 것 이상으로 진행됩니다.

디렉터리만 일치시키고 다른 파일은 포함하지 않으려면 다음을 사용하세요.

<DirectoryMatch ^/var/www(/aaa|/bbb)?/?$>

LocationMatch나는 아마도 (가능하다면) 디렉토리 구조에 신경 쓸 필요가 없도록 하는 것을 선호할 것입니다 .

관련 정보