使用 Apache VirtualHost 创建通配符子域

Posted

技术标签:

【中文标题】使用 Apache VirtualHost 创建通配符子域【英文标题】:Creating Wildcard Sub Domain Using Apache VirtualHost 【发布时间】:2012-11-14 00:16:00 【问题描述】:

我想有这种情况:

    如果用户使用此 URL 请求:example.comwww.example.com, 用户将在此目录中看到index.php /home/admin1/public_html/

    但是当用户请求使用其他子域(通配符)例如:freediscount.example.com,用户将在此路径中看到index.php/home/admin1/public_html/userweb/freediscount.example.com

我的主机技术支持建议我使用这种方法:http://www.wiredstudios.com/php-programming/setting-up-wildcard-dns-for-subdomains-on-cpanel.html

基于该教程,PHP 有一项新工作......当用户请求子域时重定向到特定文件夹。我不喜欢这种方法。对我来说,如果 Apache 能处理这个会更好。

几乎接近我需要的是这种方法:Virtualhost For Wildcard Subdomain and Static Subdomain

但是,我的VirtualHost 设置有问题,如何针对这种情况正确创建VirtualHost

这是我做过但没用的:

## I think this one is for www or without www, automatically generated with WHM
<VirtualHost xx.xx.xx.xx:80> 
ServerName example.com
ServerAlias www.example.com
DocumentRoot /home/admin1/public_html
</VirtualHost>

## Here's what I'm trying to add
<VirtualHost xx.xx.xx.xx:80>
    ServerName example.com
    DocumentRoot /home/admin1/public_html/userweb/*
</VirtualHost>

【问题讨论】:

【参考方案1】:

通配符子域绝对可以使用 Apache 虚拟主机。

我有基本相同的要求,并设法让它与 Apache 的 mod_vhost_alias.so 模块一起工作。在你的 http-vhosts.conf 文件中试试这个:

DocumentRoot "/home/admin1/public_html/userweb/" 
<Directory "/home/admin1/public_html/userweb/"> 
    Options None 
    AllowOverride None 
    Order allow,deny 
    Allow from all 
</Directory>

<VirtualHost *:80>
    DocumentRoot /home/admin1/public_html/
    ServerName www.example.com
</VirtualHost>

<VirtualHost *:80> 
    VirtualDocumentRoot /home/admin1/public_html/userweb/%1.example.com/ 
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot /home/admin1/public_html/
    ServerName example.com
</VirtualHost>

请注意,我尚未对此进行测试,但它与对我有用的解决方案非常接近。

我的解决方案的完整细节在这里: http://www.calcatraz.com/blog/wildcard-subdomains-in-apache-1422

【讨论】:

今天链接失效。 %1.example.com 将失败(. 是一个元字符,在这种情况下必须跟一个整数)。它可以是%1.0.example.com 作为一种解决方法。【参考方案2】:

试试这个:

NameVirtualHost *:80

<VirtualHost *:80>
  DocumentRoot /home/admin1/public_html/
  ServerName www.example.com
</VirtualHost>

<VirtualHost *:80>
  DocumentRoot /home/admin1/public_html/userweb/freediscount.example.com
  ServerName  other.example.com
  ServerAlias *.example.com
</VirtualHost>

<VirtualHost *:80>
  DocumentRoot /home/admin1/public_html/
  ServerName example.com
</VirtualHost>

虚拟主机的顺序及其特殊性很重要。

【讨论】:

freediscount.example.com 只是一个例子。在现实世界中,用户可以键入他们创建的子域。例如:mystore.example.com >> /home/admin1/public_html/userweb/mystore.example.com 所以我认为将其设为静态 DocumentRoot 不会解决此问题。它是动态的。 您不能制作通配符 DocumentRoots。您需要通过 .htaccess 文件或通过 php 执行此操作。这就是您可以对虚拟主机执行的操作。也许有 apache mod 可以满足您的需求。但就目前而言,我认为就是这样。

以上是关于使用 Apache VirtualHost 创建通配符子域的主要内容,如果未能解决你的问题,请参考以下文章

带有 VirtualHost 代理的 Apache 2.4 缓存

IIS 相当于 Apache 中的 VirtualHost

如何使用 Apache VirtualHost 获取 .htaccess 文件

如何使用 Apache VirtualHost 获取 .htaccess 文件

导入/包含要在 Apache 的 httpd.conf 中使用的外部 VirtualHost 文件

VirtualHost 始终在 Ubuntu 14.04 上使用 Apache 返回默认主机