Nginx Location 基本配置
基本语法格式:
Location block 的基本语法形式是: location [=|~|~*|^~|@] pattern { ... } [=|~|~*|^~|@] 被称作 location modifier ,这会定义 Nginx 如何去匹配其后的 pattern ,以及该 pattern 的最基本的属性(简单字符串或正则表达式)
location 的匹配符
1.等于匹配符:=
等于匹配符就是等号,特点可以概括为两点:
精确匹配,优先级最高,匹配成功后则停止向下搜索
不支持正则表达式
1 2 3 4 5 6 7 8 9 10 11 12 | server { server_name website.com; location = /abcd { […] } } 匹配情况: http: //website .com /abcd # 正好完全匹配 http: //website .com /ABCD # 如果运行 Nginx server 的系统本身对大小写不敏感,比如 Windows ,那么也匹配 http: //website .com /abcd ?param1m2 # 忽略查询串参数(query string arguments),这里就是 /abcd 后面的 ?param1m2 http: //website .com /abcd/ # 不匹配,因为末尾存在反斜杠(trailing slash),Nginx 不认为这种情况是完全匹配 http: //website .com /abcde # 不匹配,因为不是完全匹配 |
2.空匹配符
空匹配符的特点是:
匹配以指定模式开始的 URI,区分大小写,字符串匹配
不支持正则表达式
1 2 3 4 5 6 7 8 9 10 11 12 13 | # 可以不写 location modifier ,Nginx 仍然能去匹配 pattern 。这种情况下,匹配那些以指定的 patern 开头的 URI,注意这里的 URI 只能是普通字符串,不能使用正则表达式。 server { server_name website.com; location /abcd { […] } } 匹配情况: http: //website .com /abcd # 正好完全匹配 http: //website .com /ABCD # 如果运行 Nginx server 的系统本身对大小写不敏感,比如 Windows ,那么也匹配 http: //website .com /abcd ?param1m2 # 忽略查询串参数(query string arguments),这里就是 /abcd 后面的 ?param1m2 http: //website .com /abcd/ # 末尾存在反斜杠(trailing slash)也属于匹配范围内 http: //website .com /abcde # 仍然匹配,因为 URI 是以 pattern 开头的 |
3.正则匹配符:~ 和 ~*
正则匹配符是可以使用正则表达式的匹配符。不过这里要强调的是,一般来说~是指:
区分大小写的正则匹配
但是对于一些对大小写不敏感的操作系统,这两者没有区别。另外一个就是^~,其表示以指定模式开始的正则匹配。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # 这个 location modifier 对大小写敏感,且 pattern 须是正则表达式 server { server_name website.com; location ~ ^ /abcd $ { […] } } 匹配情况: http: //website .com /abcd # 完全匹配 http: //website .com /ABCD # 不匹配,~ 对大小写是敏感的 http: //website .com /abcd ?param1m2 # 忽略查询串参数(query string arguments),这里就是 /abcd 后面的 ?param1m2 http: //website .com /abcd/ # 不匹配,因为末尾存在反斜杠(trailing slash),并不匹配正则表达式 ^/abcd$ http: //website .com /abcde # 不匹配正则表达式 ^/abcd$ # 注意:对于一些对大小写不敏感的系统,比如 Windows ,~ 和 ~* 都是不起作用的,这主要是操作系统的原因。 |
~* 表示:不区分大小写的正则匹配
1 2 3 4 5 6 7 8 9 10 11 12 | server { server_name website.com; location ~* ^ /abcd $ { […] } } 匹配情况: http: //website .com /abcd # 完全匹配 http: //website .com /ABCD # 匹配,这就是它不区分大小写的特性 http: //website .com /abcd ?param1m2 # 忽略查询串参数(query string arguments),这里就是 /abcd 后面的 ?param1m2 http: //website .com /abcd/ # 不匹配,因为末尾存在反斜杠(trailing slash),并不匹配正则表达式 ^/abcd$ http: //website .com /abcde # 不匹配正则表达式 ^/abcd$ |
4. ^~
匹配情况类似 2. (空字符) 的情况,以指定匹配模式开头的 URI 被匹配,不同的是,一旦匹配成功,那么 Nginx 就停止去寻找其他的 Location 块进行匹配了(与 Location 匹配顺序有关)
5. 内部访问符:@
用于定义一个 Location 块,且该块不能被外部 Client 所访问,只能被 Nginx 内部配置指令所访问,比如 try_files or error_page。一般用于错误页面等。
匹配符优先级
Location匹配规则
语法规则: 【= | ^~ | ~ | ~* | / | /uri 】
1 2 3 4 5 6 7 | location = /uri = 表示精确匹配,只有完全匹配上才能生效,若找到,停止搜索; location ^~ /uri ^~开头表示对URL路径进行前缀匹配,并且在正则匹配之前,若找到,停止搜索; location ~ pattern ~开头表示区分大小写的正则匹配,按配置文件顺序匹配; location ~* pattern ~*开头表示不区分大小写的正则匹配,按配置文件顺序匹配; location !~和!~* 分别为区分大小写不匹配及不区分大小写不匹配 的正则 location /uri 不带任何修饰符,表示前缀匹配,在正则匹配之后; location / 通用匹配,任何未匹配到其他location的请求都会匹配到,相当于default; |
多个location配置的情况匹配顺序为
1 2 3 4 5 | 首先精确匹配 = ; 其次前缀匹配 ^~; 其次是按照配置文件中的正则匹配; 然后匹配不带任何修饰符的前缀匹配; 最后交给/通用匹配 |
案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] } location / { # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 # 但是正则和最长字符串会优先匹配 [ configuration B ] } location /documents/ { # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索 # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条 [ configuration C ] } location ~ /documents/Abc { # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索 # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条 [ configuration CC ] } location ^~ /images/ { # 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。 [ configuration D ] } location ~* \.(gif|jpg|jpeg)$ { # 匹配所有以 gif,jpg或jpeg 结尾的请求 # 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则 [ configuration E ] } location /images/ { # 字符匹配到 /images/,继续往下,会发现 ^~ 存在 [ configuration F ] } location /images/abc { # 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在 # F与G的放置顺序是没有关系的 [ configuration G ] } location ~ /images/abc/ { # 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用 [ configuration H ] } location ~* /js/ .*/\.js |
每天记录一点,就能多学一点,充实一点
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示