nginx location匹配规则

85 阅读2分钟

nginx.org/en/docs/htt…

Syntax:	location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
Default:	—
Context:	server, location

规则

" = "修饰符可以定义URI和location的精确匹配,如果找到完全匹配,则终止搜索。

“~”修饰符(用于区分大小写的匹配)使用正则表达式指定,正则表达式的搜索在第一个匹配处终止。

“~*”修饰符(用于不区分大小写的匹配)使用正则表达式指定,正则表达式的搜索在第一个匹配处终止。

“^”前缀有“^”修饰符,则不检查正则表达式。

“@”前缀定义了一个命名location。这样的location不用于常规的请求处理,而是用于请求重定向。它们不能嵌套,也不能包含嵌套的location。

检查顺序

为了匹配给定请求的location,nginx首先检查使用前缀字符串定义的location(前缀location),选择匹配前缀最长的location并记住。然后按照正则表达式在配置文件中的出现顺序检查,正则表达式的搜索在第一个匹配处终止。如果最长匹配的前缀location有“^~”修饰符,则不检查正则表达式。使用" = "修饰符可以定义URI和location的精确匹配。如果找到完全匹配,则终止搜索。例如,如果频繁出现“/”请求,定义“location = /”将加快这些请求的处理速度,因为搜索在第一次比较后立即终止。

示例

示例1

location = / {
    [ configuration A ]
}

location / {
    [ configuration B ]
}

location /documents/ {
    [ configuration C ]
}

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

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

" / "请求将匹配配置A,

" /index.html "请求将匹配配置B,

" /documents/document.html "请求将匹配配置C,

" /images/1.gif "请求将匹配配置D,

" /documents/1.jpg "请求将匹配配置E。

示例2

如果location以斜杠字符结尾的前缀字符串定义,并且请求由 proxy_pass、fastcgi_pass、uwsgi_pass、scgi_pass、memcached_pass 或 grpc_pass 之一处理,需执行特殊处理。 为了响应 URI 等于此字符串但没有尾部斜杠的请求,代码301的重定向将返回到附加斜杠的请求URI。

如果不需要,可以像这样定义 URI 和location的精确匹配:

location /user/ {
    proxy_pass http://user.example.com;
}

location = /user {
    proxy_pass http://login.example.com;
}

示例3

server {
    root /www/data;

    location / {
    }

    location /images/ {
    }

    location ~ .(mp3|mp4) {
        root /www/media;
    }
}

示例中,NGINX 在文件系统的 /www/data/images/ 目录中搜索以 /images/ 开头的 URI。 但如果 URI 以 .mp3 或 .mp4 扩展名结尾,NGINX 会在 /www/media/ 目录中搜索该文件,因为它是在匹配的位置块中定义的。

如果请求以斜杠结尾,NGINX 会将其视为对目录的请求,并尝试在该目录中查找索引文件。 index 指令定义索引文件的名称(默认值为index.html)。

继续这个例子,如果请求 URI 是 /images/some/path/,NGINX 会传送文件 /www/data/images/some/path/index.html(如果存在)。 如果没有,NGINX 默认返回 HTTP 代码 404(未找到)。 要将 NGINX 配置为返回自动生成的目录列表,请在 autoindex 指令中包含 on 参数:

location /images/ {
    autoindex on;
}

可以在index指令中列出多个文件名。NGINX按照指定的顺序搜索文件,并返回第一个找到的文件。

location / {
    index index.$geo.html index.htm index.html;
}

这里使用的$geo变量是一个通过geo指令设置的自定义变量。该变量的值取决于客户端的IP地址。

location / {
    root /data;
    index index.html index.php;
}

location ~ .php {
    fastcgi_pass localhost:8000;
    #...
}

在这里,如果请求中的URI是/path/,而/data/path/index.html不存在,但/data/path/index.php存在,则对/path/index.php的内部重定向将映射到第二个位置。因此,请求被代理。