Code前端首页关于Code前端联系我们

Nginx放置语法规则、匹配和示例代码

terry 2年前 (2023-09-28) 阅读数 57 #未命名

前端接管Nginx和节点层。日常工作中,有很多工作需要用到Nginx。其中,位置是使用和修改最多的地方。之前我对位置匹配规则了解甚少。为了了解这个职位是如何分配的,我花了一些时间查阅了一些资料并总结了这篇文章。我希望这对大家有帮助。

语法规则

location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }

复制代码

语法规则非常简单,关键字 location 后面是可选的修饰符,后面是要匹配的字符以及要在大括号中执行的操作。修饰符

  • = 表示完全匹配。仅当请求的 URL 路径完全等于以下字符串时才会进行访问。
  • ~表示规则是使用正则表达式定义的,并且区分大小写。
  • ~*表示规则是使用常规规则定义的,并且不区分大小写。
  • ^~ 表示如果符号后的字符是最佳匹配,则应用此规则并且不再执行进一步搜索。

分配过程

序列化请求的 URL。例如,解码%xx等字符,删除URL中多个附加的/,解析❙❙’❙‷‷‷。 在网址中。 等这一步是配对的准备工作。

位置有两种表示形式,一种是使用前缀字符,另一种是使用正则表达式。如果是常规的,则前面带有修饰符 ~~*

具体匹配过程如下:

首先检查前缀字符定义的位置,选择最长匹配的项并记录。

如果找到精确匹配的位置,即带有修饰符=的位置,则结束搜索并使用其配置。

然后逐步搜索使用正则表达式定义的位置。如果它们匹配,则停止搜索并使用它定义的配置。

如果没有匹配的规则位置,则使用之前记录的前缀字符的最长匹配位置。

根据上面的匹配过程,我们可以得到以下两点体会:

  1. 使用正则表达式定义的位置在配置文件中出现的顺序非常重要。因为找到第一个匹配的正则模式后,搜索就会停止,无法匹配后面的正则模式。
  2. 使用精确匹配可以加快搜索速度。例如,如果您经常需要 /,则可以使用 = 来定义位置。

示例

接下来我们将通过一个示例来详细说明配对过程。

假设我们有以下配置文件:

location = / {
    [ configuration A ]
}

location / {
    [ configuration B ]
}

location /user/ {
    [ configuration C ]
}

location ^~ /images/ {
    [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
    [ configuration E ]
}

复制代码

Request /完全匹配A,无需再查看。

请求/index.html匹配B。首先找到匹配的前缀字符,找到B的最长匹配配置,然后按顺序找到对应的正则规则。没有找到结果,所以使用上一个标签的最长匹配,即配置B。

请求/user/index.html匹配C。首先找到最长匹配C。因为没有匹配后面的正则模式,使用最长匹配C。

请求/user/1.jpg匹配E。先搜索前缀字符,找到最长匹配C,然后继续正常搜索,找到匹配条目E。所以使用E。

需要/images/1.jpg匹配D。首先查找前缀字符以找到最长的匹配D。但奇怪的是,它使用♝ ^ 修饰符,并且不进行后续的正常匹配搜索,因此使用D。这里,如果没有前面的修饰符,最终匹配的实际上是E,你可能会想知道为什么。

请求/documents/about.html与B匹配。因为B意味着任何以/开头的URL都会匹配。上述配置中,只有B可以满足,所以B是配对的。用法

place @name

@ 用于定义命名地点。主要用于内部重定向,不能用于处理普通请求。它的用法如下:

location / {
    try_files $uri $uri/ @custom
}
location @custom {
    # ...do something
}
复制代码

在上面的例子中,当你尝试访问url并且找不到匹配的文件时,它将被重定向到我们自己命名的位置(这里是自定义的)。

值得注意的是,一个命名位置不能嵌套其他命名位置。 URL 末尾的 / 是否需要

?关于URL末尾的/,有三点需要解释。第一点与位置配置有关,其他两点无关。对于

  1. 位置的字符是否包含/没有影响。换句话说,/user//user 是相同的。
  2. 如果 URL 结构为 https://domain.com/,则末尾带有 / 不会导致重定向。因为浏览器发起请求时,默认会添加 /。虽然很多浏览器不会在地址栏中显示/。你可以去百度验证一下。
  3. 如果 URL 结构为 https://domena.com/nejaký-dir/。末尾缺少 / 将导致重定向。因为按照约定,URL 末尾的 / 表示目录,而缺少 / 表示文件。因此,当访问/some-dir/时,服务器会自动去该目录寻找对应的默认文件。如果访问/some-dir,服务器会首先查找文件some-dir。如果找不到,则会将 some-dir 视为目录并重定向。转到 /some-dir/ 并在该目录中找到默认文件。您可以测试您的网站,看看是否如此。

总结

位置配置有两种形式,前缀字符和正则表达式。搜索匹配时,首先搜索前缀字符,选择最长的匹配,然后搜索共同模式。常规字符的优先级高于前缀字符。

按照配置文件中的顺序进行定期搜索。因此,正则表达式的顺序非常重要。建议比较详细的放在前面。

使用= 进行精确匹配可以加快搜索过程。如果根域名使用频繁,建议使用=。 ?商业转载请联系作者获取授权。非商业转载请注明出处。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门