3

在下面的代码中, index 指令添加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所以它似乎在尝试位置匹配之前使用索引。那么在上述情况下,为什么location = /在应用索引后uri变成了匹配/page1.htm

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

4

3 回答 3

4

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

  1. 当 uri 到达服务器块时,将通过位置解析它,而不index应用任何指令。

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

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

于 2016-02-10T19:54:21.390 回答
-1

nginx 文档对此非常清楚:

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

...

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

于 2017-07-26T14:03:08.767 回答
-1

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

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

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

在步骤:

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

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

于 2016-02-10T07:31:22.140 回答