$host
三个 Nginx 变量,$http_host
和有什么区别$server_name
?
我有一个重写规则,我不确定应该使用哪一个:
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/;
}
我正在寻找的答案不仅是“在重写规则中使用 ___ 变量”,而且还解释了它们之间的理论差异。
您几乎应该始终使用
$host
,因为无论用户代理的行为如何,它都是唯一能保证具有某些合理性的方法,除非您特别需要其他变量之一的语义。不同之处在nginx 文档中进行了解释:
$host
包含“按此优先顺序:请求行中的主机名,或“主机”请求标头字段中的主机名,或与请求匹配的服务器名”$http_host
包含 HTTP“Host”标头字段的内容,如果它存在于请求中$server_name
包含server_name
处理请求的虚拟主机的,正如它在 nginx 配置中定义的那样。如果 aserver
包含多个server_name
s,则此变量中仅存在第一个。由于用户代理在请求行中而不是在 Host: 标头中发送主机名是合法的,尽管除了连接到代理时很少这样做,您必须考虑到这一点。
您还必须考虑用户代理根本不发送主机名的情况,例如古老的 HTTP/1.0 请求和现代编写不佳的软件。您可以通过将它们转移到不提供任何服务的包罗万象的虚拟主机来做到这一点,如果您正在为多个网站提供服务,或者如果您的服务器上只有一个网站,您可以通过单个虚拟主机处理所有内容. 在后一种情况下,您也必须考虑到这一点。
只有
$host
变量说明了用户代理在形成 HTTP 请求时可能做的所有事情。我想补充一点在接受的答案中没有提到的重要一点。
$host
没有端口号,但$http_host
包含端口号。编辑:并非总是如此。
我设置了一个标题 "add_header Y-blog-http_host "$http_host" always;"
然后
curl -I -L domain.com:80
(或 443),标题根本不显示端口号。使用 nginx-extra 1.10.3 验证。是因为它是常见的 http(s) 端口还是 nginx 配置?此评论只是为了说明事情并不总是按照您的想法行事。我也为此苦苦挣扎了一段时间。当我明白 $http_XXXXX 指的是所有声明的标头变量时,我就很清楚了。
所以 $http_user_agent, $http_referer 是“USER AGENT”,“REFERER”,用小写和下斜线引用。这解释了我在许多 NGINX 配置示例中的地狱 $http_upgrade 来自哪里。
从https://stackoverflow.com/questions/15414810/whats-the-difference-of-host-and-http-host-in-nginx阅读
TL;DR:如果你不使用正则表达式,
server_name
你可以忽略这个答案?。由于在其他答案中根本没有提到这方面,但我发现这有点烦
$host
人:我在创建日志文件名时使用,如下所示:唉,如果你在你的节中使用正则表达式,
server_name
比如:您
$host
实际上最终会包含这样的正则表达式(是的,包括反斜杠和所有内容):我发现这很烦人,最终将我的正则表达式更改为:
捕获完整名称以在日志文件名中重复使用。然后将相应的节更改为: