使用 Apache VirtualHost 创建通配符子域
Posted
技术标签:
【中文标题】使用 Apache VirtualHost 创建通配符子域【英文标题】:Creating Wildcard Sub Domain Using Apache VirtualHost 【发布时间】:2012-11-14 00:16:00 【问题描述】:我想有这种情况:
如果用户使用此 URL 请求:example.com
或 www.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 创建通配符子域的主要内容,如果未能解决你的问题,请参考以下文章