ServerName 和 ServerAlias 如何工作?

ServerName 和 ServerAlias 如何工作?

我需要进一步澄清的是虚拟主机配置的以下部分:

<VirtualHost *:80>
  # Admin email, Server Name (domain name), and any aliases
  ServerAdmin [email protected]
  ServerName  141.29.495.999
  ServerAlias example.com
...

这是一个示例配置,与我当前拥有的类似(我目前没有域名)。

<VirtualHost *:80>- 允许对端口 80 上的所有 HTTP 请求(这些请求指向可联系此服务器的 IP)进行以下设置。例如,如果可以通过多个 IP 访问服务器,则可以将此指令限制为仅一个 IP,而不是两个 IP。

ServerName- 如果 HTTP 请求的主机部分与此名称匹配,则允许该请求。通常,这将是映射到 IP 的域名,但在这种情况下,HTTP 请求主机必须与此 IP 匹配。

ServerAlias- 服务器接受的备用名称。

让我感到困惑的是,在上述情况下,如果我设置ServerAlias mytestname.com并向 发出 HTTP 请求mytestname.com,那么必须有一个指向服务器 IP 的 DNS 记录才能正常工作?在这种情况下,ServerAlias 基本上只是额外的 ServerName 条目吗?

假设我有一个 DNS 条目,foobar.com = 141.29.495.999但是后来我有ServerName = 141.29.495.999ServerAlias为空,这是否意味着虽然 foobar.com 解析为正确的 IP,但是因为没有引用在ServerName或中接受 foobar.com ServerAlias

或者别的什么。我有点糊涂了。

答案1

可以这样想:

DNS 是电话簿/黄页。当有人想打电话给你时,他们可以查找你的名字,获取你的电话号码,然后拨打该电话。DNS 的作用相同,但对于计算机而言 - 当有人想访问时,www.example.com他们会向 DNS 询问 IP 地址,然后他们可以联系具有该 IP 地址的计算机。这就是解决意思。解析 IP 地址与 Apache 完全无关;它严格来说是一个 DNS 问题。

ServerName更像ServerAlias是公司的内部电话列表。您的网络服务器是电话总机;它将接受所有传入到服务器的连接。然后客户端/呼叫者将告诉他们要查找的名称,它将在 Apache 配置中查找如何处理该名称。

如果名称未在 apache 配置中作为 ServerName/ServerAlias 列出,apache 将始终为其提供列出的第一个 VirtualHost。或者,如果根本没有 VirtualHost,则无论请求中给出什么主机名,它都会提供相同的内容。

ETA:因此,逐步实现正常连接:

  1. http://www.example.com在浏览器中输入。
  2. 您的计算机会询问其 DNS 解析器,当它想要与 通信时应该使用哪个 IP 地址www.example.com
  3. 您的计算机连接到该 IP 地址,并表示它想要与之对话www.example.com(这是Host:HTTP 中的标头)。
  4. 网络服务器查看其配置以确定如何处理来自 的内容请求www.example.com。可能发生以下任一情况:
    • www.example.com被列为ServerName或- 如果ServerAliasVirtualHost这样,那么它将使用该 VirtualHost 的配置来传递内容。
    • 服务器根本没有任何 VirtualHosts - 如果是这样,那么它将使用其 httpd.conf 中的配置来传递内容。
    • 该服务器具有虚拟主机,但未www.example.com在任何虚拟主机中列出 - 如果是这样,则列表中的第一个虚拟主机将用于传递内容。

答案2

如果您未定义 ServerName,则 apache2 将尝试从 /etc/hosts 中猜测它。ServerAlias 是可选的。最常见的用例是

ServerName example.com
ServerAlias www.example.com

确保请求到达 Web 服务器 IP 取决于您(而不是 apache2 的工作),例如,注册域名并设置 DNS 记录。在没有域名和 DNS 记录的情况下,一种非常常见的方法(用于测试和开发)是设置本地计算机 /etc/hosts 文件,以便 example.com 指向服务器的 IP。

192.168.0.12 example.com
192.168.0.12 www.example.com

答案3

<VirtualHost *:80>
    ServerName influenceknowledge.test
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html/work-force/public
    ServerAlias influenceknowledge.test *.influenceknowledge.test
    <Directory /var/www/html/influence-knowledge/public >
       AllowOverride All
           Require all granted
    </Directory>    
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

答案4

我强烈建议阅读有关该主题的官方文档:https://httpd.apache.org/docs/2.4/vhosts/name-based.html

它说“如果在包含最具体的匹配 IP 地址和端口组合的虚拟主机集合中未找到匹配的 ServerName 或 ServerAlias,则将使用匹配的第一个列出的虚拟主机。”。因此,如果您访问“foobar.com”,则 httpd 将使用第一个以某种方式匹配 IP 141.29.495.999 的 VirtualHost 条目

同一文档还提到“许多服务器希望通过多个名称进行访问。使用 ServerAlias 指令即可实现这一点”。因此,您可以将 ServerAlias 简单地视为附加的 ServerName 条目。

相关内容