Nginx之匹配规则

概念:

我们可以通过配置Location指令块,来决定客户端发过来的请求URI如何处理。

语法:

Syntax: location [ = | ~ | ~* | ^~ ] uri { … }
location @name { … }
Default: —
Context: server, location
location 配置可以有两种配置方法,可以在server指令块和location指令块配置。

1、修饰符 + uri(资源路径)

2、@ + name

修饰符:
=  :精确匹配(必须全部相等)
 ~  :大小写敏感(正则表达式)
 ~* :忽略大小写(正则表达式),这里要注意忽略大小写的意思是请求的字符大小写都可以,
 但是不会进行大小转换,请求的大小写对应的文件必须存在。
 ^~ :只需匹配uri部分
 @  :内部服务跳转
Location 配置实例:

1、=,精确匹配,一般是匹配某个具体文件。

location = /index.html {
[ configuration ]
}
则匹配到http://www.lutixia.com/index.html这种请求。
还有这种写法,精准匹配/,可以加快首页访问速度。

location = / {
root html;
index index.html;
}
有一点需要注意,如果想变更根目录,比如把根目录设置为/usr/local/nginx/html/lutixia,那么直接这么写可能会出问题,假如原根目录(html)没有index.html文件,会报404。

location = / {
root /usr/local/nginx/html/lutixia;
index index.html;
}
如果写成这样的话,即使lutixia目录下有index.html,也会直接报错,
报找不到文件,可是里面明明有文件呀。
解释:
当我们访问www.lutixia.com/时,确实匹配到了这个location,
但是这个时候请求的前缀会变成/index.html,所以已经不再匹配这个localtion规则。
因为找不到其他匹配规则,
所以默认会去匹配根目录下(html)的文件,但是这时根目录下的index.html不存在,
所以报错404。
同样的,如果lutixia目录里面有其他的文件,我们通过这个localtion规则也是无法访问的, 因为它只匹配/,其他的url都不再是它匹配。

那么怎么解决这个问题呢?可以在加一个location。
location = / {
root html/lutixia;
index index.html;
}
location / {
root html/lutixia;
index index.html;
}

通过加这个location,凡是没有匹配到的资源会到/目录下去找
,根的目录重新定义了,所以可以实现这个需求。
2、~,大小写敏感(正则表达式)

location ~ /LUTIXIA/ {
[ configuration ]
}
#请求示例
#http://www.lutixia.com/LUTIXIA/ [成功]
#http://www.lutixia.com/lutixia/ [失败]
3、~*,大小写忽略(正则表达式)

location ~* /LUTIXIA/ {
[ configuration ]
}

则会忽略 uri 部分的大小写

#http://www.lutixia.com/LUTIXIA/ [成功] 可以成功匹配,但是目录中要LUTIXIA文件
#http://www.lutixia.com/lutixia/ [成功] 可以成功匹配,但是目录中要lutixia文件
4、^~,只匹配以 uri 开头,匹配成功以后,会停止搜索后面的正则表达式匹配

location ^~ /img/ {
[ configuration ]
}
#以 /img/ 开头的请求,都会匹配上
#http://www.lutixia.com/img/lutixia.jpg [成功]
#http://www.lutixia.com/img/lutixia.png [成功]
5、匹配以gif、jpg、jpeg结尾的文件

location ~* .(gif|jpg|jpeg)$ {
[ configuration ]
}
#http://www.lutixia.com/img/lutixia.jpg [成功]
如果配置了4,那么所有请求 /img/ 下的图片会被上面4处理,因为 ^~ 指令匹配到了,则不检查正则表达式。

5、@,nginx内部跳转

location /data/ {
error_page 404 @img_err;
}

location @img_err {
[ configuration ]
}
#以 /data/ 开头的请求,如果链接的状态为 404。则会匹配到 @img_err 这条规则上。
同时有多个location时,优先级如下:
完整范例:
这里有一简短的localtion配置:

    location  /img/ {
            echo " /img/";
    }
    location ~ /img/ {
            echo "~ /img/";
    }
    location ~* /img/ {
            echo "~* /img/";
    }
    location ^~ /img/ {
            echo "^~ /img/";
    }
    location = /img/ { 
            echo "=  /img/";
    }

如果客户端的请求是:

http://192.168.0.116/img/
那么按照匹配规则顺序应该是这样的:

第一步:取出uri:/img/

第二步:去匹配localtion规则,查找有没有 = /img/的规则,有则停止匹配。

[root@www ~]# curl 192.168.0.116/img/
= /img/
第三步:将location = /img/规则注释,继续查找有没有 ^~ /img/的规则,

[root@www ~]# curl 192.168.0.116/img/
^~ /img/
第四步:将 location ^~ /img/注释,这是它会去查找有没有正则匹配规则。

location /img/ {
echo " /img/";
}
location ~ /img/ {
echo “~ /img/”;
}
location ~* /img/ {
echo “~* /img/”;
}
location ^~ /img/ {
echo “^~ /img/”;
}
location = /img/ {
echo “= /img/”;
}

其中,第一个和的第二个规则都是正则,这时会按照至上而下的顺序匹配。

[root@www ~]# curl 192.168.0.116/img/
/img/
第五步:其他的都注释后,因为优先匹配规则都没有找到,最后匹配到 /img/规则。

[root@www ~]# curl 192.168.0.116/img/

转载:https://www.zhihu.com/tardis/sogou/art/75157470

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: nginx的location匹配规则是根据请求的URI(Uniform Resource Identifier)来匹配location指令中的模式,从而确定应该由哪个location块来处理该请求。nginx的location匹配规则有以下几种: 1. 精确匹配:如果location指令中的模式与请求的URI完全一致,则匹配成功。 2. 前缀匹配:如果location指令中的模式是以“/”开头的字符串,则匹配请求URI中以该字符串开头的部分。 3. 正则匹配:如果location指令中的模式是一个正则表达式,则匹配请求URI与该正则表达式的匹配结果。 4. 最长前缀匹配:如果有多个location指令的模式都能匹配请求URI,则选择最长的那个模式来处理请求。 5. 通用匹配:如果没有任何location指令能够匹配请求URI,则使用通用匹配来处理请求。 以上就是nginx的location匹配规则,可以根据实际需求选择不同的匹配方式来处理请求。 ### 回答2: nginx是一个高性能的Web服务器、反向代理和负载均衡器,它广泛用于各种(动态)网站和Web应用程序的部署中。在nginx中,location是一个非常重要的配置指令,它可以帮助服务器根据请求的URL路径(URI)匹配指定的服务或文件。 location的匹配规则如下: 1. 精确匹配(=):只有当请求URI与location指定的URI完全匹配时,才会执行该location指令之后的操作。 例如: location = /hello { return 200 "Hello, nginx!\n"; } 当访问/hello时,会直接返回"Hello, nginx!"字符串,不会再进行其他的匹配和处理。 2. 前缀匹配(^~):如果请求URI以location指定的前缀开头,那么该location指令之后的操作将被执行。 例如: location ^~ /images/ { alias /var/www/myapp/static/images/; } 当访问/images/logo.png时,该请求将被映射到服务器文件系统中的/var/www/myapp/static/images/logo.png文件。 3. 正则表达式匹配(~和~*):location指定的URI可以是一个正则表达式,如果请求URI与该正则表达式匹配成功,则该location指令之后的操作将被执行。 其中,~表示区分大小写的正则表达式匹配,而~*表示不区分大小写的正则表达式匹配。 例如: location ~ /users/([0-9]+)/photos/(.*)\.jpg$ { proxy_pass http://backend_server/photos/$1/$2.jpg; } 当访问/users/123/photos/myphoto.jpg时,该请求将被映射到http://backend_server/photos/123/myphoto.jpg后端服务器上进行处理。 4. 普通匹配:如果以上三种匹配规则都不匹配成功,那么nginx会采用普通匹配规则。首先,nginx会查找URI中是否包含文件扩展名,如果有,则nginx会按照扩展名指定的类型进行处理;如果没有,nginx则会使用server指令中指定的默认类型进行处理。 例如: location / { index index.html index.php; try_files $uri $uri/ /index.php?$query_string; } 当访问任何URI时,都会先查找该URI所对应的文件是否存在,如果存在,则直接返回该文件内容;否则,重定向到/index.php页面进行处理。 总之,在nginx中,location是一个非常强大的配置指令,可以根据不同的匹配规则,灵活地配置不同的服务和文件,从而提高网站的性能和稳定性。熟练掌握location的匹配规则对于nginx的使用和维护都是非常重要的。 ### 回答3: Nginx是一种高性能的Web服务器和反向代理服务器,同时也是一个邮件代理服务器。当使用Nginx作为Web服务器时,可以使用location匹配规则来确定如何处理请求。location匹配规则Nginx服务器使用的一个非常重要的配置选项。它可让用户在指定的URL路径中,对请求做出特定的响应。 Nginx的location匹配规则可以分为两种类型:正则和非正则。正则匹配是基于正则表达式的匹配。它可以根据URL路径中的模式匹配,使用正则表达式的语法来表示匹配规则。非正则匹配是基于URL路径的匹配。它可以直接匹配特定的URL路径,而不需要使用正则表达式。 当Nginx服务器接收到一个请求时,它首先会按照配置文件中location的顺序进行匹配匹配成功后,Nginx会按照顺序处理该请求,直到找到一个匹配完全符合要求的location为止。如果找不到一个匹配完全符合请求的location,则会使用默认的location做出响应。 对于正则匹配规则,需要使用~或~*开头,其中~表示区分大小写,~*表示不区分大小写。比如:location ~ ^/download/.+\.(zip|rar)$ {},表示当请求路径以/download/开头,并且以.zip或.rar结尾时,使用当前配置块进行处理。 对于非正则匹配规则,需要使用=或^~开头,其中=表示完全匹配,^~表示使用前缀匹配。比如:location = /index.html {},表示当请求路径为/index.html时,使用当前配置块进行处理。 除了以上两种匹配规则外,Nginx还提供了一些其他的匹配规则,比如按文件夹优先匹配,按通用优先匹配等,具体可以根据业务场景来选择相应的匹配规则,来达到更好的匹配效果。 总之,Nginx的location匹配规则非常重要,可以用来处理各种不同的请求,帮助Web服务器实现更灵活的请求处理方式,提高Web服务器的性能和安全性。熟悉和掌握Nginx的location匹配规则,对于Web服务器的运维和开发都有着非常大的帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值