Apache httpd 2.4 中是否有多個相同目錄指令的簡寫?
這是 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>