【问题标题】:Virtualhost For Wildcard Subdomain and Static Subdomain通配符子域和静态子域的虚拟主机
【发布时间】:2024-12-11 19:10:02
【问题描述】:

我有一个奇怪的情况,我想让 URL 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 变量并不能修复它。

【问题讨论】:

    标签: apache subdomain virtualhost wildcard-subdomain


    【解决方案1】:
    <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。

    【讨论】:

    • 问个问题,NameVirtualHost *:80 是做什么的?
    • 该指令启用基于名称的虚拟主机,并将告诉 apache 侦听端口 80 上的所有 ip (*)。Apache 2.2 文档:httpd.apache.org/docs/2.2/en/vhosts/name-based.html
    • 移除NameVirtualHost *:80: AH00548: NameVirtualHost 无效,下个版本会移除
    • 通配符对我不起作用,你知道为什么吗?
    • NameVirtualHost *:80 对 apache 2.2 很重要,不需要 apache 2.4,我不知道为什么。
    【解决方案2】:

    通配符只能用于ServerAlias 而不能用于ServerName。让我难过的事情。

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】: