Apache-2.4
將許多 VirtualHosts 合併到一個塊中,這是 SetEnvIf 的工作嗎?
編輯我認為我需要的是
SetEnvIf
為了方便起見,我試圖將我所有的埠 80 虛擬主機合併到一個塊中,但我正在努力解決最後一塊難題。
所有埠 80 的虛擬主機都接受一個
www
和non-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 指令和容器中定義 a
VirtualDocumentRoot
並使用適當的正則表達式。<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
。參考: