用于通配符子域和静态子域的虚拟主机

时间:2009-04-16 22:52:42

标签: apache subdomain virtualhost wildcard-subdomain

我有一个奇怪的情况,我希望网址app1.example.comexample.com*.example.com都使用不同的虚拟主机。这就是我所拥有的(不包括example.com,因为它只会使它变得更加混乱)。

<VirtualHost *>
  ServerName app1.example.com
  ServerAlias app1.example.com

  DocumentRoot = /var/www/app1
  # Other configuration for this app here

</VirtualHost>

<VirtualHost *>
  ServerName wildcard.example.com
  ServerAlias *.example.com

  DocumentRoot = /var/www/wildcard
  # other configuration for this app here

</VirtualHost>

问题是他们发生冲突。无论哪一个列出首先胜出。如何托管通配符虚拟主机和特定主机虚拟主机?

注意:我不只是在配置中更改DocumentRoot,因此使用mod_rewrite更改DocumentRoot变量无法修复它。

3 个答案:

答案 0 :(得分:150)

<VirtualHost *:80>
  DocumentRoot /var/www/app1
  ServerName app1.example.com
</VirtualHost>

<VirtualHost *:80>
  DocumentRoot /var/www/example
  ServerName example.com
</VirtualHost>

<VirtualHost *:80>
  DocumentRoot /var/www/wildcard
  ServerName other.example.com
  ServerAlias *.example.com
</VirtualHost>

应该有效。如果没有明确匹配,第一个条目将成为默认条目。因此,如果你有app.otherexample.com指向它,它将被捕获为app1.example.com。

答案 1 :(得分:9)

通配符只能在ServerAlias中使用,而不能在ServerName中使用。让我难过的东西。

对于您的用例,以下内容应该足够了

<VirtualHost *:80>
    ServerAlias *.example.com
    VirtualDocumentRoot /var/www/%1/
</VirtualHost>

https://www.chris-shaw.com/blog/using-wildcards-in-virtual-hosts-on-apache

还有更多信息

答案 2 :(得分:1)

这也适用于https需要这样的解决方案来制作项目目录。因为Chrome不再喜欢non ssl了,所以不再使用免费的ssl。注意:我的Web服务器在Windows 10上是Wamp64,因此除非有变量,否则我不会因为变量而使用此配置。

<VirtualHost *:443>
ServerAdmin test@test.com
ServerName test.com
ServerAlias *.test.com

SSLEngine On
SSLCertificateFile "conf/key/certificatecom.crt"
SSLCertificateKeyFile "conf/key/privatecom.key"

VirtualDocumentRoot "${INSTALL_DIR}/www/subdomains/%1/"

DocumentRoot "${INSTALL_DIR}/www/subdomains"
<Directory "${INSTALL_DIR}/www/subdomains/">
    Options +Indexes +Includes +FollowSymLinks +MultiViews
AllowOverride All
Require all granted
</Directory>