【问题标题】:how does an exact location match work in nginx?精确的位置匹配如何在 nginx 中工作?
【发布时间】:2016-05-20 06:47:49
【问题描述】:

在下面的代码中,索引指令将page1.htm 添加到/ 请求中。所以我希望 http://DOMAIN 的完全匹配将由第二个位置块而不是第一个匹配。

index page1.htm;

location = /
    {
    rewrite / /page2.htm;
    }

location = /page1.htm
    {
    rewrite /page1.htm /page3.htm;
    }

但这是第一个匹配的位置。 http://DOMAIN 给我page2.htmhttp://DOMAIN/page1.htm 给我page3.htm.

= 前缀支持哪种精确匹配?

我浏览了很多文档,但我不清楚这里发生了什么。如果第一个位置被删除,那么http://DOMAIN 给我page3.htm 所以它似乎在尝试位置匹配之前使用索引。那么在上述情况下,为什么在应用索引后uri变为/page1.htmlocation = /匹配?

是否先在未应用索引的情况下测试位置,然后仅在不匹配时才在应用索引的情况下再次测试它们?

【问题讨论】:

  • 你认为的http://DOMAIN请求,其实是http://DOMAIN/请求。 HTTP 协议就是这样工作的,路径部分不能为空,至少是一个斜线(/)。
  • 是的,我知道。仍然没有解释如何使用上面详细说明的完全匹配来应用索引。

标签: nginx nginx-location


【解决方案1】:

nginx documentation 对此非常清楚:

位置可以由前缀字符串或正则表达式定义。正则表达式使用前面的“~*”修饰符(用于不区分大小写的匹配)或“~”修饰符(用于区分大小写的匹配)指定。为了找到与给定请求匹配的位置,nginx 首先检查使用前缀字符串(前缀位置)定义的位置。其中,匹配前缀最长的位置被选中并记忆。然后按照它们在配置文件中出现的顺序检查正则表达式。正则表达式的搜索在第一次匹配时终止,并使用相应的配置。如果找不到与正则表达式的匹配项,则使用前面记住的前缀位置的配置。

...

此外,使用“=”修饰符可以定义 URI 和位置的精确匹配。如果找到完全匹配,则搜索终止。

【讨论】:

    【解决方案2】:

    我发布答案以防其他人正在研究这个相当晦涩的问题。进一步的测试揭示了以下内容:

    1. 当 uri 到达服务器块时,它会通过 没有应用任何index 指令的位置。

    2. 如果生成的路径解析为有效目录,并且存在index 指令,则索引中的文件名按顺序排列 附加到路径并测试是否存在有效文件。

    3. 如果第 2 步导致路径发生更改(通过添加存在的索引文件名),则使用新路径再次解析位置。

    【讨论】:

      【解决方案3】:

      URL http://example.comhttp://example.com/ 实际上对于 HTTP 是完全一样的。两者都将发送为

      GET / HTTP/1.1
      Host: example.com
      ... other headers
      

      意味着路径部分永远不会为空,并且总是以斜杠/ 开头。在这种情况下,很明显,您对http://example.com 的请求以page2.htm 结束。

      分步:

      1. Nginx 找到完全匹配 / 并将请求重写为 /page2.htm
      2. 没有位置匹配 /page2.htm 所以 nginx 只是提供静态文件。

      您可以看到这里从未使用过 index

      【讨论】:

      • 我认为您错过了问题的重点。我已经知道您刚刚写的所有内容,但这并不能解决问题。问题是何时应用索引指令?再次阅读我的问题。如果第一个位置被删除,那么即使路径只是“/”,也会发送 page3。因此,在这种情况下,索引会在解析位置之前应用于路径。唯一有意义的似乎是首先在没有索引指令的情况下解析位置,如果不匹配,则使用索引指令再次解析。是这样的吗?
      • index 在 nginx 发现你的请求最终在一个目录中时起作用。因此,如果您请求/some/dir/,则您有目录$document_root/some/dir/,然后nginx 将尝试从index 附加文件名并查找文件。如果找到文件,nginx 会将该文件名添加到请求中(将是/some/dir/index.htm)并进行内部重定向。
      • 也就是说,如果路径是目录,那么首先解析位置而不应用索引,然后如果不匹配,则应用索引再次解析?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-13
      • 2012-10-08
      相关资源
      最近更新 更多