AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 706438
Accepted
Jeff Widman
Jeff Widman
Asked: 2015-07-17 17:50:59 +0800 CST2015-07-17 17:50:59 +0800 CST 2015-07-17 17:50:59 +0800 CST

Nginx 变量 $host、$http_host 和 $server_name 有什么区别?

  • 772

$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/;
        }

我正在寻找的答案不仅是“在重写规则中使用 ___ 变量”,而且还解释了它们之间的理论差异。

rewrite nginx
  • 4 4 个回答
  • 78835 Views

4 个回答

  • Voted
  1. Best Answer
    Michael Hampton
    2015-07-17T18:07:27+08:002015-07-17T18:07:27+08:00

    您几乎应该始终使用$host,因为无论用户代理的行为如何,它都是唯一能保证具有某些合理性的方法,除非您特别需要其他变量之一的语义。

    不同之处在nginx 文档中进行了解释:

    • $host包含“按此优先顺序:请求行中的主机名,或“主机”请求标头字段中的主机名,或与请求匹配的服务器名”
    • $http_host包含 HTTP“Host”标头字段的内容,如果它存在于请求中
    • $server_name包含server_name处理请求的虚拟主机的,正如它在 nginx 配置中定义的那样。如果 aserver包含多个server_names,则此变量中仅存在第一个。

    由于用户代理在请求行中而不是在 Host: 标头中发送主机名是合法的,尽管除了连接到代理时很少这样做,您必须考虑到这一点。

    您还必须考虑用户代理根本不发送主机名的情况,例如古老的 HTTP/1.0 请求和现代编写不佳的软件。您可以通过将它们转移到不提供任何服务的包罗万象的虚拟主机来做到这一点,如果您正在为多个网站提供服务,或者如果您的服务器上只有一个网站,您可以通过单个虚拟主机处理所有内容. 在后一种情况下,您也必须考虑到这一点。

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

    • 80
  2. Mohammed Noureldin
    2018-01-04T17:37:25+08:002018-01-04T17:37:25+08:00

    我想补充一点在接受的答案中没有提到的重要一点。

    $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 配置?此评论只是为了说明事情并不总是按照您的想法行事。

    • 4
  3. luison
    2019-01-17T02:15:35+08:002019-01-17T02:15:35+08:00

    我也为此苦苦挣扎了一段时间。当我明白 $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阅读

    • 1
  4. 0xC0000022L
    2022-05-07T14:26:33+08:002022-05-07T14:26:33+08:00

    TL;DR:如果你不使用正则表达式,server_name你可以忽略这个答案?。

    由于在其他答案中根本没有提到这方面,但我发现这有点烦$host人:我在创建日志文件名时使用,如下所示:

    access_log /var/log/nginx/access_$host.log
    

    唉,如果你在你的节中使用正则表达式,server_name比如:

    server_name ~^(?<subdomain>foo|bar|baz)\.example.net;
    

    您$host实际上最终会包含这样的正则表达式(是的,包括反斜杠和所有内容):

    access_~^(?<subdomain>foo|bar|baz)\.example.net.log
    

    我发现这很烦人,最终将我的正则表达式更改为:

    server_name ~^(?<fulldomain>(?<subdomain>foo|bar|baz)\.example.net);
    

    捕获完整名称以在日志文件名中重复使用。然后将相应的节更改为:

    access_log /var/log/nginx/access_$fulldomain.log
    
    • 1

相关问题

  • 阿帕奇虚拟主机

  • IIS 7 中的 URL 重写

  • IIS7 请求跟踪日志上的 URL_CHANGED 事件是什么?

  • 如何强制我的网址始终以 www 开头?

  • mod_rewrite 不转发 GET 参数

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve