Skip to content

location

在 Nginx 中,location 用于定义针对特定 URL 路径的处理规则。

location 匹配规则

匹配变量

Nginx 的 location 规则匹配的变量是 $uri, 所以不用管后面的参数 $query_string (或者 $args)

匹配种类

nginx
location [空格 | = | ~ | ~* | ^~ | @ ] /uri/ {
  ...
}

上面分为三部分:

  • 最前面的字符 (location modifier) 匹配规则
  • 后面 uri 的匹配规则 (location match)
  • 大括号内的路由转发

modifier(修饰符)

格式:[空格 | = | ~ | ~* | ^~ | @ ]

详细解释:

字符解释
空格如果直接是一个空格,那就是不写 location modifier ,Nginx 仍然能去匹配 pattern 。这种情况下,匹配那些以指定的 patern 开头的 URI,注意这里的 URI 只能是普通字符串,不能使用正则表达式。
=表示精确匹配,如果找到,立即停止搜索并立即处理此请求。
~表示执行一个正则匹配,区分大小写匹配
~\*表示执行一个正则匹配,不区分大小写匹配, 注意,如果是运行 Nginx server 的系统本身对大小写不敏感,比如 Windows ,那么 ~* 和 ~ 这两个表现是一样的
^~即表示只匹配普通字符(跟空格类似,但是它优先级比空格高)。使用前缀匹配,^表示“非”,即不查询正则表达式。如果匹配成功,并且所匹配的字符串是最长的, 则不再匹配其他 location。
@用于定义一个 Location 块,且该块不能被外部 Client 所访问,只能被 Nginx 内部配置指令所访问,比如 try_files 或 error_page

匹配优先级(从高到低)

  1. =
  2. ^~
  3. ~/~*
  4. 空格

需要注意的细节:

  • 常规字符串匹配类型。是按前缀匹配(从根开始)。 而正则匹配是包含匹配,只要包含就可以匹配
  • ~~* 的优先级一样,取决于在配置文件中的位置,最上面的为主,跟匹配的字符串长度没关系,所以在写的时候,应该越精准的要放在越前面才对
  • 空格^~ 都是字符串匹配,所以如果两个后面的匹配字符串一样,是会报错的,因为 nginx 会认为两者的匹配规则一致,所以会有冲突
  • ^~, =, ~, ~* 这些修饰符和后面的 URI 字符串中间可以不使用空格隔开(大部分都是用空格隔开)。但是 @ 修饰符必须和 URI 字符串直接连接

基于 MIT 许可发布