具有多个子域的 Apache AliasMatch

具有多个子域的 Apache AliasMatch

我有以下虚拟主机:

<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]

相关内容