我有一台带有多个虚拟主机的 Apache2 服务器。其中一个域现在需要 SSL,以便他们可以使用 Stripe 进行付款。
我为该域(域 1)配备了一个与服务器主 IP 不同的独立 IP。(主服务器 99.99.99.88,独立 IP 99.99.99.99)
在切换一切之前,我试图让它在端口 80(非 SSL)上工作,以便我知道我的虚拟机正在运行。
当我转到 IP(99.99.99.99)时,它会解析为域 2,这是服务器的默认域,而不是域 1。
httpd.conf 中的 Listen 命令是 Listen 80
这是我的 vhosts.conf 的相关代码
NameVirtualHost *:80
NameVirtualHost 99.99.99.99:80
<VirtualHost 99.99.99.99:80>
ServerName domain1.com
DocumentRoot /var/www/vhosts/domain1.com/httpdocs
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /var/www/vhosts/domain2.com/html
ServerName www.domain2.com
</VirtualHost>
<VirtualHost *:80>
ServerName portal.domain2.com
DocumentRoot /var/www/vhosts/domain2.com/portal/public
</VirtualHost>
<VirtualHost *:80>
ServerName demo.domain2.com
DocumentRoot /var/www/vhosts/domain2.com/demo/public
</VirtualHost>
<VirtualHost *:80>
ServerName domain3.info
DocumentRoot /var/www/vhosts/domain3.info/html
</VirtualHost>
<VirtualHost *:80>
ServerName domain1.com
DocumentRoot /var/www/vhosts/domain1.com/httpdocs
</VirtualHost>
我需要做什么才能当我使用 99.99.99.99 访问服务器时可以访问域 1?
答案1
httpd 看到的第一个 *:80 记录 VirtualHost 将成为 *:80 的默认站点。因此,如果您输入的任何主机名不是有效的 ServerName 条目,它将落入您的 domain2 条目。
您可以通过将“真实”基本网站指定为配置中第一个 *:80 虚拟主机来帮助阻止此行为。
针对特定 IP 地址单独定位网站是一种很好的做法,例如:
NameVirtualHost 99.99.99.99:80
<VirualHost 99.99.99.99:80>
ServerName domain2.com
...
</VirtualHost>
执行上述操作应能保证具有特定 IP 地址的站点从该 IP 的明确条目中提供服务,而不是由于“最具体的配置获胜”而导致的默认设置。
参考这里:
ServerName 继承 最好始终在每个基于名称的虚拟主机中明确列出 ServerName。如果 VirtualHost 未指定 ServerName,则将从基本服务器配置中继承服务器名称。如果未全局指定服务器名称,则在启动时通过第一个侦听地址的反向 DNS 解析检测服务器名称。无论哪种情况,此继承的服务器名称都会影响基于名称的虚拟主机解析,因此最好始终在每个基于名称的虚拟主机中明确列出 ServerName。
例如,假设您正在为域 www.example.com 提供服务,并且您希望添加指向相同 IP 地址的虚拟主机 other.example.com。然后,只需将以下内容添加到 httpd.conf:
<VirtualHost *:80>
# This first-listed virtual host is also the default for *:80
ServerName www.example.com
ServerAlias example.com
DocumentRoot /www/domain
</VirtualHost>
<VirtualHost *:80>
ServerName other.example.com
DocumentRoot /www/otherdomain
</VirtualHost>