ServerName 和 ServerAlias 如何工作?

njp*_*njp 84 domain-name-system apache-2.2 apache-2.4

这是我需要进一步说明的虚拟主机配置的以下部分:

<VirtualHost *:80>
  # Admin email, Server Name (domain name), and any aliases
  ServerAdmin example@example.com
  ServerName  141.29.495.999
  ServerAlias example.com
...
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

对我来说,令人困惑的部分是,在上述情况下,如果我设置ServerAlias mytestname.com然后向 发出 HTTP 请求mytestname.com,则必须有一个指向服务器 IP 的 DNS 记录才能正常工作?在这种情况下,ServerAlias 只是基本上 EXTRA ServerName 条目吗?

假设我有一个 DNS 条目,foobar.com = 141.29.495.999但后来我有ServerName = 141.29.495.999并且ServerAlias是空的,这是否意味着尽管 foobar.com 被解析为正确的 IP,因为没有引用来接受 foobar.com in ServerNameor ServerAlias

或者其他的东西。伙计,我很困惑。

Jen*_*y D 124

可以这样想:

DNS 是电话目录/黄页。当有人想拨打您的电话时,他们可以查找您的姓名并获取您的电话号码并拨打该电话。DNS 的作用相同,但对于计算机 - 当有人想要访问时,www.example.com他们会向 DNS 询问 IP 地址,然后他们可以联系具有该 IP 地址的计算机。这就是决心的意思。解析 IP 地址与 Apache 没有任何关系;这严格来说是一个 DNS 问题。

ServerNameServerAlias更像是一个公司的内部电话清单。您的网络服务器是总机;它将接受所有传入的服务器连接。然后客户端/调用者会告诉他们他们正在寻找什么名称,它会在 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被列为 aServerNameServerAliasfor a VirtualHost- 如果是这样,那么它将使用该 VirtualHost 的配置来传递内容。
    • 服务器根本没有任何 VirtualHosts - 如果有,那么它将使用其 httpd.conf 中的配置来传递内容。
    • 服务器有 VirtualHosts 但未www.example.com在其中任何一个中列出 - 如果是,则列表中的第一个 Virtualhost 将用于传送内容。


bla*_*lau 21

如果你没有定义 ServerName,那么 apache2 会尝试从 /etc/hosts 猜测它。ServerAlias 是可选的。最常见的用例是

ServerName example.com
ServerAlias www.example.com
Run Code Online (Sandbox Code Playgroud)

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

192.168.0.12 example.com
192.168.0.12 www.example.com
Run Code Online (Sandbox Code Playgroud)