Nginx 的 location 指令用于配置请求 URI(Uniform Resource Identifier,统一资源标识符)的匹配规则,以决定如何处理客户端发送的请求。其语法如下:`location ( = | ~ | ~* | ^~ ) uri { … }` 或者 `location @name { … }`。以下是对各种匹配模式的详细解释: - `=`:精确匹配。请求的 URI 必须与指定的 `uri` 完全相等才能匹配成功。这种匹配方式优先级最高,如果匹配成功,则停止其他匹配。例如:`location = /index.html { … }` 会精确匹配 `http://www.example.com/index.html` 这样的请求。 - `~`:区分大小写的正则匹配。用于匹配符合指定正则表达式的 URI。例如:`location ~ /LUTIXIA/ { … }` 可以匹配 `http://www.example.com/LUTIXIA/`,但不能匹配 `http://www.example.com/lutixia/`(区分大小写)。 - `~*`:不区分大小写的正则匹配。与 `~` 类似,但不区分 URI 中字符的大小写。例如:`location ~* /LUTIXIA/ { … }` 既能匹配 `http://www.example.com/LUTIXIA/`,也能匹配 `http://www.example.com/lutixia/`。 - `^~`:以指定的 `uri` 开头进行匹配。只要请求的 URI 以该前缀开头,就会匹配成功,并且不会再进行后续的正则表达式匹配。例如:`location ^~ /img/ { … }` 会匹配以 `/img/` 开头的请求,如 `http://www.example.com/img/lutixia.jpg` 等。 - `/`:不带任何修饰符的前缀匹配,但它的匹配优先级低于 `^~` 和正则匹配。例如:`location /img/ { … }` 会匹配以 `/img/` 开头的请求。 - `@`:内部服务跳转。不是用于直接匹配客户端请求,而是用于在 Nginx 内部进行跳转,通常与 `error_page` 指令配合使用,以处理特定的错误情况。 匹配顺序如下: 1. 首先进行精确匹配(`=`),如果匹配成功,则停止其他匹配。 2. 其次进行前缀匹配(`^~`)。 3. 然后按照文件中顺序进行正则匹配(`~` 和 `~*`)。 4. 接着进行不带任何修饰的前缀匹配(`/`)。 5. 最后是交给 `/` 进行通用匹配,即任何未匹配到其他规则的请求都会匹配到这个规则,相当于 switch 中的 default。 在实际应用中,需注意以下几点: 1. 匹配的顺序是先匹配普通字符串,然后再匹配正则表达式。普通字符串匹配顺序是根据配置中字符长度从长到短,而正则表达式按照配置文件里的顺序测试,找到第一个匹配的正则表达式后将停止搜索。 2. 使用 `=` 前缀执行严格匹配,匹配成功后立即停止其他匹配并处理请求。使用 `^~` 前缀于常规字符串时,如果路径匹配则不测试正则表达式。 3. 前缀匹配时,Nginx 不对 URL 做编码。例如,请求为 `/static/20%/aa`,可以被规则 `^~/static//aa` 匹配到(注意这里的空格)。匹配成功后,URL 的域名和端口会替换为 `root` 指定的目录。 以下是一个包含多种匹配规则的示例配置及其效果解释: ```nginx location = / { echo "规则 a"; } location = /login { echo "规则 b"; } location ^~ /static/ { echo "规则 c"; } location ^~ /static/files { echo "规则 x"; } location ~ \.(gif|jpg|png|js|css)$ { echo "规则 d"; } location ~* \.png$ { echo "规则 e"; } location /img { echo "规则 y"; } location / { echo "规则 f"; } ``` 在上述配置中: - 访问根目录 `/`,比如 `http://localhost/` 将匹配规则 a。 - 访问 `http://localhost/login` 将匹配规则 b,而 `http://localhost/register` 则匹配规则 f。 - 访问 `http://localhost/static/a.html` 将匹配规则 c。 - 访问 `http://localhost/static/files/a.exe` 将匹配规则 x,虽然规则 c 也能匹配到,但因为最大匹配原则,会优先使用规则 x。 - 访问 `http://localhost/a.png` 则匹配规则 e,而不会匹配规则 d,因为规则 e 不区分大小写。 - 访问 `http://localhost/img/` 会匹配规则 y。 - 其他未匹配到上述特定规则的请求,都会匹配规则 f。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部