我对 Linux 和 apache 都很陌生。
我有一个使用 apache 托管在我电脑上的网站。假设域名是www.myweb.com
。现在我想创建 3 个子域名a.myweb.com
和b.myweb.com
。
我的第一个问题是,我可以使用虚拟主机来实现这一点吗?因为我能找到的所有虚拟主机示例都使用不同的域,所以我不确定它是否也适用于子域。
我的第二个问题是基于虚拟主机适用于子域。在我的文件中,的httpd.conf
值为。在下,我创建了 3 个文件夹,和。这是我的:DocumentRoot
/srv/http
/srv/http
default
a
b
httpd-vhosts.conf
<VirtualHost myIP:80>
ServerAdmin [email protected]
DocumentRoot "/srv/http/default/public"
ServerName www.myweb.com
ServerAlias myweb.com
ErrorLog "/srv/http/default/logs/error.log"
CustomLog "/srv/http/default/logs/access.log" combined
<Directory />
Options FollowSymLinks Indexes
Require all granted
</Directory>
</VirtualHost>
<VirtualHost myIP:80>
ServerAdmin [email protected]
DocumentRoot "/srv/http/a/public"
ServerName a.myweb.com
ErrorLog "/srv/http/a/logs/error.log"
CustomLog "/srv/http/a/logs/access.log" combined
</VirtualHost>
<VirtualHost myIP:80>
ServerAdmin [email protected]
DocumentRoot "/srv/http/b/public"
ServerName b.myweb.com
ErrorLog "/srv/http/b/logs/error.log"
CustomLog "/srv/http/b/logs/access.log" combined
<Directory />
Options FollowSymLinks Indexes
Require all granted
</Directory>
</VirtualHost>
现在的问题是,当我在浏览器中输入www.myweb.com
、myweb.com
或a.myweb.com
时b.myweb.com
,我总是被带到DocumentRoot
,也就是/srv/http
。那么我做错了什么还是子域名不能这样工作?非常感谢。
答案1
我注意到您<VirtualHost myIP:80>
在虚拟主机部分的开头使用了。我<VirtualHost *:80>
为所有基于命名的虚拟主机使用了 - 请参阅如何设置 Apache 虚拟主机配置(附示例)了解为基于名称的虚拟主机和基于 IP 的虚拟主机配置服务器之间的区别。如果服务器有多个 IP 地址,而您希望站点响应不同的 IP 地址,我认为您应该输入一个 IP 地址,但如果所有站点都应该使用服务器正在监听的任何 IP 地址进行访问,那么请尝试在虚拟主机部分中使用“*”而不是 IP 地址,看看这是否有区别。否则,您的配置看起来与我自己的类似。您还可以尝试httpd -S
检查 VirtualHost 配置语法,如该文章中建议的那样,看看 Apache 通过该检查报告的任何内容是否看起来不对劲。
答案2
您必须按照“目录”指令的要求使用完整路径Apache 文档。通过您的配置,您实际上是在配置从相应主机名对 httpd.conf 中配置的“DocumentRoot”路径的访问。
您的默认网站(www)的“目录”配置部分可能如下所示:
<Directory /srv/http/default/public>
Options FollowSymLinks Indexes
Require all granted
</Directory>
还要注意的是,目录“/”的默认访问权限是允许所有访问,这意味着 Apache httpd 将为从 URL 映射的任何文件提供服务。因此,根据文档中的建议,您可能需要在 httpd.conf 中将其更改为更受限制的内容。
<Directory "/">
Require all denied
</Directory>