我有以下虚拟主机:
<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 rewrite 吗?我想将某些子域映射到我服务器上的相关文件而不更改 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 路径而不是绝对文件路径。即简单地/%1.php
。
您可以使其更加通用,并重写任何子域的请求,其中该子域作为.php
文档根目录中的文件存在。例如:
RewriteCond %{HTTP_HOST} ^([^.]+)\.example
RewriteCond %{DOCUMENT_ROOT}/%1.php -f
RewriteRule ^ /%1.php [L]