【问题标题】:Apache 2.4 Wildcard Subdomain Virtual HostApache 2.4 通配符子域虚拟主机
【发布时间】:2014-12-28 19:53:58
【问题描述】:

我的目标是发生以下情况,当用户访问左侧下方的网站时,它会将他们带到右侧的目录:

www.example.com or example.com  =>  /var/www/example/public_html/

*.example.com                   => /var/www/example/public_html/sites/%1/public_html/

我尝试了以下方法:

NameVirtualHost *:80

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

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

主域在有或没有 www 的情况下都可以工作,但每次我尝试访问任何其他子域时,它都会带我到并给我一个 500 内部服务器错误。当我输入子域时,URL 变为如下所示:

{subdomain}.example.com/sites/{subdomain}/public_html/

我使用的是 Apache 2.4.7,是的,我已经在我的 DNS 服务器上设置了通配符。如果任何答案认为我已经将头撞到墙上 2 周试图让这个工作正常进行,我将不胜感激。

【问题讨论】:

  • 好的,那么每个子域都有不同的文件夹吗?例如,如果用户输入 URL test.example.com,它应该转到 test.example.com/sites/test/public_html?我认为您误解了配置,您应该处理另一个虚拟主机,它将处理您要处理的每个子域,对吧?
  • @Facu Farias 是的,你是对的,我为每个子域都有一个不同的文件夹,我看到无数人为网站托管设置了这个文件夹,所以我知道这是可能的。为每个子域创建一个新的 conf 的问题是我必须为每个子域输入一个新的 DNS 条目和 conf 文件。这也需要时间来传播。如果我遗漏了什么,请纠正我。
  • @FacuFarias 我不希望它物理上转到 /sites/{subdomain}/public 我希望 {subdomain}.example.com 将其作为其文档根目录。

标签: apache .htaccess dns virtualhost wildcard-subdomain


【解决方案1】:

我认为您正在寻找的配置与此配置非常相似:

NameVirtualHost *:80

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

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

你觉得呢? 在这种情况下,任何子域都将被重定向到同一个站点。这是你想要的配置吗?或者您希望每个子域有不同的配置?

【讨论】:

  • 您提供的解决方案存在一些问题。一,您不能在服务器名称中使用通配符 (*),二,我希望每个子域都映射到它自己的命名文件夹。正如我目前所拥有的那样,这应该可以使用VirtualDocumentRoot 来实现。如果您需要更多详细信息,请告诉我,谢谢! ^_^
  • 是的,对不起,我没有测试它,这只是一个例子。如果用户在您不处理的 URL 上放置了一些东西会发生什么?我的意思是.. 您不能将所有可能性映射到不同的站点,不是吗?
【解决方案2】:

好的,整个问题出在通配符目录位于另一个已经绑定的目录下。在我在其他地方创建目录后,它开始按预期工作,去图...

希望这对碰巧遇到这个奇怪错误的其他人有所帮助... ^_^

【讨论】:

  • 请详细说明解决方案
  • @Mahaimin 正如我所说,您将动态 sud-domains 绑定到的目录不能位于已绑定到域的目录下。所以解决方案是将我存储子域的位置移动到 webroot,然后它按预期工作。