我有以下虛擬主機:
<VirtualHost *:443>
ServerName article.example.com
AliasMatch "^/(.*)" "/var/www/html/article.php"
</VirtualHost>
<VirtualHost *:443>
ServerName company.example.com
AliasMatch "^/(.*)" "/var/www/html/company.php"
</VirtualHost>
我想將所有內容都放在一個虛擬主機下,如下所示:
<VirtualHost *:443>
ServerName example.com
ServerAlias *.example.*
AliasMatch "^(article|company)\.example\.*/(.*)" "/var/www/html/$1.php"
</VirtualHost>
這可能嗎?我必須使用mod重寫嗎?我想將某些子網域對應到我的伺服器上的相關檔案而不更改 url。我想article.example.com/test-article
映射到article.php
.
答案1
AliasMatch "^(article|company)\.example\.*/(.*)" "/var/www/html/$1.php"
該AliasMatch
指令與請求的 URL 路徑相符(正如您在第一個範例中所做的那樣),而不是主機名稱(正如您在這裡嘗試做的那樣),所以這樣的事情將不匹配。
正如您所建議的,顯而易見的選擇是 mod_rewrite 。例如:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(article|company)\.
RewriteRule ^ /var/www/html/%1.php [L]
其中%1
反向引用包含前面捕獲的子模式的匹配項條件模式。
如果/var/www/html
是文檔根目錄,那麼可以從代換字串,重寫為文檔根相對 URL 路徑而不是絕對文件路徑。 IE。簡單地/%1.php
。
您可以使其更加通用,並重寫對任何子網域的請求,其中該子網域作為.php
文件存在於文件根目錄中。例如:
RewriteCond %{HTTP_HOST} ^([^.]+)\.example
RewriteCond %{DOCUMENT_ROOT}/%1.php -f
RewriteRule ^ /%1.php [L]