이것은 아파치 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
나는 아마도 (가능하다면) 디렉토리 구조에 신경 쓸 필요가 없도록 하는 것을 선호할 것입니다 .