Apache-2.4

將許多 VirtualHosts 合併到一個塊中,這是 SetEnvIf 的工作嗎?

  • March 5, 2022

編輯我認為我需要的是SetEnvIf

為了方便起見,我試圖將我所有的埠 80 虛擬主機合併到一個塊中,但我正在努力解決最後一塊難題。

所有埠 80 的虛擬主機都接受一個wwwnon-www連接到/.well-known/acme-challenge/. 所有其他請求 301 到https://example.com/ - 沒有 www。

我想我需要%{HTTP_HOST}變成一個可以定義的變數減去可能的“www”,例如${SITE}

或者也許有更好的方法?

這是我目前所處的位置:

<VirtualHost ${IP1}:80>
   Define SITE hmmm
   ServerName example-1.com
   ServerAlias www.example-1.com
   ServerAlias example-2.com
   ServerAlias www.example-2.com
   # And so on... 25 vhosts
   DocumentRoot /home/user/htdocs/${SITE}

   RewriteEngine on
   RewriteCond %{REQUEST_URI} !^/\.well\-known/acme\-challenge/
   RewriteRule ^ https://${SITE}%{REQUEST_URI} [NE,R=301,L]

   <Directory /home/user/htdocs/${SITE}>
       Options FollowSymLinks
       AllowOverride None
       Require all granted
   </Directory>
</VirtualHost>

我想我需要的是 SetEnvIf

但是,AFAIK,您不能在and指令中使用環境變數。(並且您不能使用正則表達式將變數轉換為計算/動態字元串。)DocumentRoot``<Directory>``Define

DocumentRoot /home/user/htdocs/${SITE}

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/\.well\-known/acme\-challenge/
RewriteRule ^ https://${SITE}%{REQUEST_URI} [NE,R=301,L]

<Directory /home/user/htdocs/${SITE}>

您可以改為在 mod_rewrite 指令和容器中定義 aVirtualDocumentRoot並使用適當的正則表達式。<DirectoryMatch>

例如,假設您的所有域都具有以下形式,<name>.<tld>然後嘗試以下而不是上述指令子集:

VirtualDocumentRoot "/home/user/htdocs/%-2.0.%-1.0"

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+?)\.?$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [NE,R=301,L]

<DirectoryMatch "/home/user/htdocs/[^.]+\.com">

該指令的%-2.0.%-1.0一部分VirtualDocumentRoot從請求的主機名中擷取域名和 TLD(最後 2 部分)。重要的是,這不包括可選的 www 子域(右起第三部分)。

替換字元串中的%1反向引用引用了主機名中減去前面CondPattern中擷取的可選前綴(子域)的部分。(這也排除了 FQDN 的尾隨點。)RewriteRule www.

<DirectoryMatch>指令允許訪問任何形式的目錄/home/user/htdocs/<example>.com

參考:

引用自:https://serverfault.com/questions/1095381