![多个子域名 apache 2.4](https://linux22.com/image/729844/%E5%A4%9A%E4%B8%AA%E5%AD%90%E5%9F%9F%E5%90%8D%20apache%202.4.png)
我不太擅长管理(也不是以英语为母语的人,而且我正在努力简单任务:添加子域名在 Apache 2.4 上。以下是我的配置文件:
<VirtualHost *:80>
ServerName domain.io
ServerAlias domain.io
ServerAlias *.domain.io
DocumentRoot /var/www/html/david
ErrorLog /var/log/apache2/error.example.com.log
CustomLog /var/log/apache2/access.example.com.log combined
</VirtualHost>
第二:
<VirtualHost *:80>
ServerName sub.domain.io
ServerAlias sub.domain.io
ServerAlias *.sub.domain.io
DocumentRoot /var/www/html/ness_pro
<Directory /var/www/html/ness_pro>
Options Indexes FollowSymLinks MultiViews
AllowOverride all
Order allow,deny
allow from all
Require all granted
</Directory>
ErrorLog /var/log/apache2/error.example.com.log
CustomLog /var/log/apache2/access.example.com.log combined
</VirtualHost>
[问题] 每次我尝试访问子域名.io使用浏览器,我最终进入了与域名.io。我遵循了 apache 2.4 的指导原则(即在 sites-available -> a2ensite -> systemctl restart 中进行编辑)。
[关于我的 DNS 配置]我重定向子域名.io到域名.io在我的 DNS 提供商(Gandi)上。它指向正确的 URL。我天真地以为 Apache 会分析请求 URL 以不同 VHost 之间的调度但看来我太天真了。有没有简单的方法可以解决这个问题(我总是发现 apache url 重写相当晦涩难懂)?
[环境] Debian 9(raspbian)// Apache 2.4
[编辑] 既然大家都在问。这是我的 DNS 记录
@ 10800 IN SOA ns1.gandi.net. hostmaster.gandi.net. 1542647212 10800 3600 604800 10800
@ 10800 IN A 77.193.111.117
@ 10800 IN MX 10 spool.mail.gandi.net.
@ 10800 IN MX 50 fb.mail.gandi.net.
@ 10800 IN TXT "v=spf1 include:_mailcust.gandi.net ?all"
blog 10800 IN CNAME blogs.vip.gandi.net.
sub 10800 IN CNAME webredir.vip.gandi.net.
webmail 10800 IN CNAME webmail.gandi.net.
www 10800 IN CNAME webredir.vip.gandi.net.
答案1
这可能无法回答您的问题,但是,我准备了相同的场景,使用了相同的文件,仅更改了 DocumentRoot,并且顺序是相反的,正如我在评论中告诉您的那样:
# /etc/apache2/sites-enabled/000-domain.io.conf
<VirtualHost *:80>
ServerName sub.domain.io
ServerAlias sub.domain.io
ServerAlias *.sub.domain.io
DocumentRoot /var/www/html/serverfault/sub
<Directory /var/www/html/serverfault/sub>
Options Indexes FollowSymLinks MultiViews
AllowOverride all
Order allow,deny
allow from all
Require all granted
</Directory>
ErrorLog /var/log/apache2/error.example.com.log
CustomLog /var/log/apache2/access.example.com.log combined
</VirtualHost>
<VirtualHost *:80>
ServerName domain.io
ServerAlias domain.io
ServerAlias *.domain.io
DocumentRoot /var/www/html/serverfault/parent
ErrorLog /var/log/apache2/error.example.com.log
CustomLog /var/log/apache2/access.example.com.log combined
</VirtualHost>
在每个页面中创建了一个测试页面DocumentRoot
:
echo “parent” > /var/www/html/serverfault/parent/index.html echo “sub” > /var/www/html/serverfault/sub/index.html chown www-data:www-data /var/www/html/serverfault/ -R
为了模拟 DNS,我编辑了该/etc/hosts
文件,包括:
# ...
127.0.0.1 domain.io
127.0.0.1 sub.domain.io
127.0.0.1 www.domain.io
127.0.0.1 www.sub.domain.io
# ...
重新启动Apache:systemctl restart apache2
此外,使用 Firefox 的“Tamper Data”插件,我开始操作Host
每个请求的标头,并且响应会根据预期发生变化。
我不明白为什么你的程序无法工作。要查看 Apache 服务中是否有任何未完成的警报,你可以使用journalctl -u apache2
DNS
我使用我的域中的 DNS 来更真实地了解您的场景,它的工作方式与使用主机文件、使用 CNAME 或使用 A 记录相同,它们都可以正常工作。
按照个人偏好,我会说 A 记录应该是服务器的名称,然后是不同主机标头的 CNAME,类似于(您的服务器对我来说是 1.1.1.1):
webserver01 10800 IN A 1.1.1.1
www 10800 IN CNAME webserver01.domain.io.
sub 10800 IN CNAME webserver01.domain.io.
或者,根据您的情况,您可以将 CNAMES 指向 @,并在其中设置 IP:
@ 10800 IN SOA ns1.gandi.net. hostmaster.gandi.net. 1542647212 10800 3600 604800 10800
@ 10800 IN A 77.193.111.117
sub 10800 IN CNAME @
www 10800 IN CNAME @
我不知道该语法是否有效,也许:
sub 10800 IN CNAME domain.io.
www 10800 IN CNAME domain.io.
(注意后面的.
)
第三种选择是生成所有 A 记录,指向直接 IP,这可能在更大的环境中更难维护,但同样有效:
sub 10800 IN A 1.1.1.1
www 10800 IN A 1.1.1.1
需要考虑的一件事是,sub 不是您公开的 domain.io 的子域,它只是 domain.io 的主机。您应该创建一个区域以使其成为子域。
甘地
我很确定这webredir.vip.gandi.net.
是导致你没有得到预期行为的原因,如果你看到文档,您使用的重定向类型如下:
何时使用?用于传统的网页转发(例如,转发到托管在另一个页面上的现有网站。这通常用于将域名转发到已托管在给定地址的博客或其他免费个人页面。)
它看起来像是他们提供的最简单的托管的基本重定向,如果您转到同一页面中的第 3 项,它会显示:
何时使用?如果您的主机为您的 HTTP 服务器提供了一个 IP 地址(或者您使用 Gandi 的托管服务自行托管),或者告诉您在区域文件中创建特定的“A”、“MX”或“CNAME”(等等)记录。
从我们掌握的信息来看,我认为这就是您的情况,不是吗?
我希望这些信息和测试能有所帮助
答案2
第一个条目包含ServerAlias *.domain.io
。地址sub.domain.io
匹配*.domain.io
。
如果您要使用名称sub.domain.io
,则该条目需要放在第一个,或者至少在之前*.domain.io
。