三个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请求和现代的编写不当的软件。 你可能会这样做,把它们转移到一个不能提供任何服务的虚拟主机,如果你正在服务多个网站,或者你的服务器上只有一个网站,你可能会通过一个虚拟主机。 在后一种情况下,你也必须考虑到这一点。
只有$host
variables说明了用户代理在形成一个HTTP请求时可能做的所有事情。