Nginxvariables$ host,$ http_host和$ server_name有什么区别?

三个Nginxvariables$host$http_host$server_name什么$http_host

我有一个重写规则,我不知道我应该使用哪一个:

 location = /vb/showthread.php { # /vb/showthread.php?50271-What-s-happening&p=846039 if ($arg_p) { return 301 $scheme://$host/forum/index.php?posts/$arg_p/; } 

我正在寻找一个答案,不只是说在你的重写规则中使用___variables,而且还解释了它们之间的理论差异。

你应该几乎总是使用$host ,因为它是唯一一个保证有一些合理的东西,不pipe用户代理的行为如何,除非你特别需要其他variables之一的语义。

这个区别在nginx文档中有解释:

  • $host包含“按照以下优先顺序:来自请求行的主机名,或者来自”主机“请求头字段的主机名,或者与请求匹配的服务器名”
  • $http_host包含HTTP“主机”头字段的内容,如果它出现在请求中
  • $server_name包含处理请求的虚拟主机的server_name ,因为它在nginxconfiguration中定义。 如果server包含多个server_name ,则只有第一个服务器将出现在此variables中。

由于用户代理在请求行中发送主机名是合法的,而不是在Host:头中,尽pipe除了连接到代理服务器以外,很less这样做,所以您必须对此进行解释。

您还必须考虑到用户代理根本不发送主机名的情况,例如,古老的HTTP / 1.0请求和现代的编写不当的软件。 你可能会这样做,把它们转移到一个不能提供任何服务的虚拟主机,如果你正在服务多个网站,或者你的服务器上只有一个网站,你可能会通过一个虚拟主机。 在后一种情况下,你也必须考虑到这一点。

只有$hostvariables说明了用户代理在形成一个HTTP请求时可能做的所有事情。