Nginx Location匹配规则
发布时间:2025-05-25 05:12:26 发布人:远客网络
一、Nginx Location匹配规则
Location规则主要分为两类:正则location和普通location,其中~和~*用于条件判断,而=和^~则是定位机制。~和~*用于正则匹配,^~表示在找到普通location后立即停止正则匹配,遵循最大前缀匹配;=则为精确匹配,一旦找到就停止搜索。
匹配顺序遵循特定规则:首先尝试普通location,若无匹配则继续查找正则location。普通location的匹配遵循最大前缀原则,而正则location按配置文件中物理顺序匹配,一旦找到即停止后续搜索。
测试实例:配置中,链接192.168.88.38/a/b,按照最大前缀匹配,首先匹配到location/a/b,返回777;链接192.168.88.38/a,先匹配到普通location,然后遇到正则location~*/a,返回888。当正则location改为location ^~/a/b时,即使后续有符合的正则,也会因为^~的阻断而返回777。
^~和=符号在普通location中,能够阻止后续的正则匹配,前者表示非精确匹配,后者则是精确匹配,确保了规则的执行效率。
对于正则表达式的使用,Nginx提供了多种匹配方式,适用于不同的业务场景。掌握这些规则对于提高服务器配置和性能至关重要。
二、Nginx中的正则如何匹配数字
Nginx中的正则表达式匹配数字及文件、目录相关规则:
1.区分大小写的匹配使用~,不区分大小写使用~*,不匹配使用!~和!~*。
2.以什么开头或结尾的匹配分别用 ^和$表示。
3.转义字符如.*?等,其中*表示任意字符。
4.判断文件或目录的存在与否使用-f-d-e-x,如-f用于判断文件存在。
location=/匹配任何查询,因为所有请求都以/开头。
location ^~/images/匹配任何以/images/开头的查询,并停止搜索其他正则表达式。
location~*.(gif|jpg|jpeg)$匹配以.gif、.jpg或.jpeg结尾的请求。
1. if指令可以使用正则表达式匹配内置变量,并根据匹配结果执行操作。
2. location指令用于匹配请求的URL,具有 ^~、=和@三个标识符。
3.=表示精确匹配,^~表示优先匹配字符串,@表示自定义location。
4.按照匹配顺序,location指令首先匹配=,然后匹配^~,最后按顺序匹配正则表达式。
server_name指令可以使用正则表达式,但必须以~开头,如 server_name www.example.com~^wwwd+.example.com$。
fastcgi_split_path_info指令用于设置SCRIPT_FILENAME和PATH_INFO变量,例如 location~ ^.+.php会将请求解析为SCRIPT_FILENAME和PATH_INFO。
gzip_disable指令通过正则表达式指定禁用gzip压缩的浏览器,如 gzip_disable"msie6"。
使用rewrite指令时,需要完整的包含引用的正则表达式,如 rewrite"/photos/([0-9]{2})([0-9]{2})([0-9]{2})"/path/to/photos/$1/$1$2/$1$2$3.png。
Nginx配置中的正则表达式匹配需要注意顺序,否则可能导致下载源码而非执行程序。
例如,在配置代码中,如果 location~.php$在 location~* ^/(user2|user3)/之后,那么访问/user2/或/user3/会直接下载程序源码。
正确配置应将 location~.php$放在前面,确保正则表达式匹配的location先于普通location执行。
三、Nginx-location路由规则配置详解
1、nginx中的location对URL进行匹配;
2、语法:location [=|~|~*|^~]/uri/{…}
3、当找到符合条件的location时,将执行内部的指令;如果使用正则表达式,必须使用~*来表示不区分大小写或者~来表示区分大小写匹配;例如:location~*.(gif|jpg|jpeg)$;当匹配成功后,将停止继续匹配;如果没有找到,则使用常规字符串处理结果;
4、如果不是使用正则表达式,可以使用=进行严格匹配;
5、如果使用^~前缀用于一个常规字符串,表示如果路径匹配,则不测试正则表达式;
6、1:=前缀的指令严格匹配这个查询;如果找到则停止继续匹配
7、2:接下来的常规字符串,长的在前,如果这个匹配使用^~前缀,匹配停止;
8、3:正则表达式,按配置文件的顺序;
9、4:如果第三步产生匹配,则使用这个结果;停止匹配;否则使用第二部的匹配结果;
10、当匹配成功后,location中可以使用rewrite进行路由重写;
11、首先需要了解nginx rewrite中可以使用到的全局变量;
12、$uri与$document_uri相同:不包含指令的uri地址
13、如aaa.com/index.php?...中的index.php
14、防盗链:注意location生效规则,否则防盗链不起作用。
15、'Referer':来源头部为空的情况
16、'Referer':来源头部不为空,但里面的值被代理或者防火墙删除,这些值都不以http://或者https://开头
17、'Referer':来源头部包含当前的server_name,就是域名
18、arbitary string:任意字符串,定义服务器名或者可选的url前缀,主机名可以使用*开头或者结尾,在检测来源头部这个过程中,来源域名中的主机端口将会被忽略;
19、regular expression:正则表达式,表示排除https://或者http://开头的字符串