Apache-Httpd

Apache httpd 2.4 中是否有多個相同目錄指令的簡寫?

  • May 3, 2019

這是 Apache 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) .

在這個例子中,我當然可以擴展正則表達式 ( /var/www/(aaa|bbb|(?!ccc))),但不幸的是,實際配置比這複雜得多。使用正則表達式可能仍然是可能的,但結果很難理解或維護。

那麼,除了 DirectoryMatch 之外,如果有某種方法可以做到這一點,有人可以給我一個提示嗎?也許可以解釋為什麼 Apache 似乎更喜歡上面的部分匹配?謝謝。

沒有一種易於閱讀的方式來DirectoryMatch匹配所有/var/www/aaa,/var/www/bbb/var/www, 但不匹配/var/www/ccc。這是因為/var/www包括所有其他三個目錄。

可能更容易的是使用mod_macro來定義配置的公共部分,然後使用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>

引用自:https://unix.stackexchange.com/questions/516777