Nginx的location匹配规则(nginx 路由配置)

2023-11-30 08:50:02 :29

nginx的location匹配规则(nginx 路由配置)

大家好,如果您还对nginx的location匹配规则不太了解,没有关系,今天就由本站为大家分享nginx的location匹配规则的知识,包括nginx 路由配置的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

本文目录

nginx 路由配置

nginx中location对url匹配; 语法:location /uri/ { … } 当匹配中符合条件的location,则执行内部指令;如果使用正则表达式,必须使用 *表明不区分大小写或者 区分大小写匹配;例如:location ~* .(gif|jpg|jpeg)$ ;当配皮成功后,将停止往下匹配;如果没有找到,则使用常规自字符串处理结果; 如果不是用正则表达式;可使用=严格匹配; 如果使用^~前缀用于一个常规字符串;表示如果路径匹配,则不测试正则表达式; 总结:指令按下列顺序被接受 1:=前缀的指令严格匹配这个查询;如果找到停止往下匹配 2:挣下的常规字符串,长的在前,如果这个匹配使用^~前缀,匹配停止; 3:正则表达式,按配置文件的顺序; 4:如果第三步产生匹配。则使用这个结果;停止匹配;否则使用第二部的匹配结果; 四个案例: 八个location案例 当匹配成功后location中可以使用rewrite进行路由重写; 首先需要了解nginx rewrite中可以使用到的全局变量; $args  :请求中get的参数,例如a=1&b=2; $body_remote_add  :二进制客户地址 $body_byte_sent  :相应时发送出去的body字节数数量,即使链接中断这个数据也是精确的; $content_length  :请求头中的Content_length字段 $content_type  :请求中的Content_type字段 $document_root  :当前请求在root指令中的位置;服务器中绝对路径 $document_url  :与uri相同 $host  :请求主机头字段,否则为服务器名称; ***隐藏网址*** $host  :请求的服务器名称; ***隐藏网址*** location ~* .(gif|jpg|png|bmp) invalid_referer) { return 403;***隐藏网址*** } }以上所有来至aaa.com和域名中包含google和baidu的站点都可以访问到当前站点的图片,如果来源域名不在这个列表中,那么$invalid_referer等于1,在if语句中返回一个403给用户,这样用户便会看到一个403的页面,如果使用下面的rewrite,那么盗链的图片都会显示403.jpg。如果用户直接在浏览器输入你的图片地址,那么图片显示正常,因为它符合none这个规则. location ~* .(gif|jpg|png|swf|flv) invalid_referer) { return 404; } } none:在浏览器输入网站域名直接访问的请求,需要允许访问的 blocked:有referer首部,但是referer首部被清除了,一般是防火墙改过的请求 server_name:带服务器名称的,一般是本机或其他服务器的请求,a.com和*.a.com是本公司的域名,要允许访问于是要先允许本机的访问,再禁止其他服务器的访问 location /public/admin/images/y.jpg { #valid_referers none blocked *.aaa.com server_names *.aaa.com ; #valid_referers none blocked www.sss.com ; #设置只有该域》 名可以访问 valid_referers none blocked 111.111.111.11; #设置只有该域名可以访》 问 if ( request_uri?; return 403;***隐藏网址*** } } . : 匹配除换行符以外的任意字符 ? : 重复0次或1次 if ( /msie/$1 break; } if ( )") { # 如果cookie匹配正则,就设置变量 id id等于正则第一个括号内匹配的部分 } if ($request_method = POST) { #如果提交方法为POST,则返回状态405(Method not allowed)。return不能返回301,302 return 405; } if ( slow可以通过 set 指令设置 limit_rate 10k; } if (!-f $request_filename){ #如果请求的文件名不存在,则反向代理到localhost 。这里的break也是停止rewrite检查 break;***隐藏网址*** } if ($args ~ post=140){ #如果query string中包含"post=140",永久重定向到example.com***隐藏网址*** } ***隐藏网址*** # 定义image日志格式 log_format imagelog ’[ image_file ’ ’ body_bytes_sent ’ ’ $status; # 开启重写日志 rewrite_log on; }

Nginx的server_name和location配置

***隐藏网址*** 虚拟主机是一种在单一主机或主机群上运行多个网站或服务的技术,可以用来解决IP地址资源有限而网站数目日益增多的问题。实现方式主要有以下三种: 其中使用最广泛无疑是基于域名的方式,不同的域名通过DNS最终可以解析到相同的IP地址,在对应的机器上我们可以使用Nginx等Web服务器软件对不同的域名请求进行相应的处理。这里再提及一点,我们平时访问一个网站,是通过DNS将其解析到某一个IP上,我们的客户端(通常是浏览器)最终是和这个IP对应的机器建立连接,从而发送请求的。那么Nginx等服务器是如何知道一个请求对应的是哪个域名的呢? 答案在于HTTP协议中的Host请求头,其值为我们要访问的域名。这里需要注意的是,在HTTP/1.0中是不支持Host请求头字段的,所以HTTP/1.0是不支持虚拟主机技术的,而根据 rfc2616规范 HTTP/1.1协议中客户端发送的请求必须带上Host这个请求头,否则服务器必须返回 400 Bad Request 响应。 ***隐藏网址*** sever_name指令后面的参数值可以是以下几种: 除了以上几种形式,还有下面几种表示特殊含义的域名: 当需要决定采用哪个server块的配置处理请求时,会根据以下的顺序查找: 示例,假设nginx只有以下server配置: 在hosts文件上加上以下配置: 我们可以直接用浏览器访问或者借助curl工具来进行测试,测试结果如下,可对照上面的查找顺序进行分析: 值得说明的是,由于上面的配置没有显示指定默认server,所以会默认匹配到第一个配置,假如我们在配置最后再添加如下配置: ***隐藏网址*** 关于listen指令,有几点需要注意的地方: ***隐藏网址*** 这时如果是在公网访问的话,不管访问上面的哪个域名都会返回"default_server",理由是不设置IP的话nginx默认会监听该机器的所有IP的特定端口,设置了的话只会监听该IP的特定端口。 本地访问同理,不能匹配到listen了公网IP的server。 了解完server_name和listen的配置规则,我们知道了一个请求过来会对应哪个server。接下来我们要讨论的是某个server下不同请求URI对应的location配置查找规则。 根据配置语法我们知道location可以有以下几种形式: 根据请求的URI和location的配置,查找请求对应的location过程如下: 根据上面的查找过程,可以得到一些配置优化点: 假设有如下配置: 测试结果如下: 关于最后一条测试结果,需要注意的是, /a/.*$ 这个正则表达式,并不要求请求URI以 /a 开头,这也是很容易疏漏的地方,若想匹配以 /a 开头的请求,应改为 ^/a/.*$ ,此时最后一条测试结果会变为C @ 前缀可以用来定义一个命名的location,该location不处理正常的外部请求,一般用来供内部重定向使用。它们不能嵌套,也不能包含嵌套的location。 例如: 这时访问 /try 或者 /error 都会返回"@name" 本文主要介绍了nginx关于 server_name 和 location 的配置以及匹配规则,并举例说明。 server_name 和 location 指令是nginx中非常重要的两条指令,掌握这两条指令对于我们配置nginx以及排查问题都是非常重要的,希望本文能帮到大家。

nginx 常用配置记录

例子:

以上一些配置为在该server下具有全局性,例如 root ,可在location中重新定义root

当我们想定义多个server监听同一个端口但访问的host不一样时,server_name就派上用场了。nginx会根据HTTP请求的header Host选择nginx配置文件里符合条件的server_name的server配置

匹配顺序如下

所以当我们监听的的端口只有一个server配置的时候,server_name 可以不填

两者作用差不多,区别在于最终映射的地址不同,例:

简单例子,匹配所有请求

一个正则匹配的例子:

一个反向代理的例子:

vue-router、react-router等路由框架要开启history模式可以选择的nginx配置的例子

location的匹配规则和顺序

还有一种特殊匹配类型 @url ,只用于nginx内部跳转,例:

例子:

有常用两种负载均衡支持调度算法,分别是 weight ip_hash 。weight 模式下可以为每个 server 设置weight值,weight值越大,分配到的访问机率越高,ip_hash 为同一个ip的 分配同一个后端服务器,这样我们不用解决session共享问题。

例子:

mime type 和 文件扩展名的对应关系一般放在 mime.types 里,然后 用 include mime.types ; mime.types作用:通过文件的扩展名设置了Content-Type,Nginx如果没找到对应文件的扩展名的话,就使用默认的Type,默认Type通用 default_type 定义,比如 default_type application/octet-stream ;***隐藏网址***

一个虚拟主机对一个文件配置,放到vhost文件夹下面,然后通过include指令包含进来,这样更便于维护和管理

配置:

参考:

***隐藏网址******隐藏网址***

Nginx location路由匹配规则

location是Nginx对HTTP请求的URI进行匹配处理的指令,location的语法形式如下: locationpattern{...} 其中, 部分称为location修饰语,修饰语定义了与URI的匹配方式。pattern为匹配项,可以是字符串或正则表达式。 1、无修饰语:完全匹配URI中除访问参数以外的内容,匹配项的内容只能是字符串,不能是正则表达式。 2、修饰语“=”:完全匹配URI中除访问参数以外的内容,Linux系统下会区分大小写,Windows系统下则不会。 3、修饰语“~”:完全匹配URI中除访问参数以外的内容,Linux系统下会区分大小写,Windows系统下则会无效。匹配项的内容必须是正则表达式。 4、修饰语“~*”:完全匹配URI中除访问参数以外的内容,不区分大小写。匹配项的内容必须是正则表达式。 5、修饰语“^~”:完全匹配URI中除访问参数以外的内容,匹配项的内容如果不是正则表达式,则不再进行正则表达式测试。 6、修饰语“@”:定义一个只能内部访问的location区域,可以被其他内部跳转指令使用,如try_files或error_page. 匹配的顺序: (location=)》(location完整路径)》(location ^~路径)》(location~,~*正则顺序)》(location 部分起始路径)》(/) 总结:Nginx常用的有四种匹配规则 1.完全匹配(=) 2.无正则普通匹配(^~)(^表示“非”,~表示“正则”,字符意思是:不要继续匹配正则) 3.正则表达式匹配(~或者~*)(~区分大小写,~*不区分大小写) 4.普通匹配(/xxx) 匹配优先级的描述: 1) 先检测匹配项的内容为非正则表达式修饰语的 location,然后再检测匹配项的内容为正则表达式修饰语的 location。 2) 匹配项的内容为正则与非正则都匹配的 location,按照匹配项的内容为正则匹配的 location 执行。 3) 所有匹配项的内容均为非正则表达式的 location,按照匹配项的内容完全匹配的内容长短进行匹配,即匹配内容多的 location 被执行。 4) 所有匹配项的内容均为正则表达式的 location,按照书写的先后顺序进行匹配,匹配后就执行,不再做后续检测。 todo:待画图解释

nginx匹配规则说明以及匹配的优先级

location = / {***隐藏网址*** } location ^~ /static/ { root /webroot/static/; } location ~* .(gif|jpg|jpeg|png|css|js|ico)$ { root /webroot/res/; } location / {***隐藏网址*** }***隐藏网址*** listen 80; server_name start.igrow.cn; index index.html index.php; root html; if ( ") {***隐藏网址*** valid_referers none blocked start.igrow.cn sta.igrow.cn; if ( host/logo.png; } } 根据文件类型设置过期时间location ~ .(js|css|jpg|jpeg|gif|png|swf) request_filename) { expires 1h; break; } } 禁止访问某个目录location ~* .(txt|doc)${ root /data/www/wwwroot/linuxtone/test; deny all; } ***隐藏网址***

nginx中路径的匹配问题

与nginx的打交道很多,经常遇到404问题,每次出现都需要查资料才能写出结果。这次来总结一下。 访问的域名是 localhost/store/add_order.html web根目录是/www/web store是子目录。 配置如下 以上location存在3个匹配规则 最先匹配 location = /50x.html 再次匹配 location ~ .php$ 最后 匹配 / ***隐藏网址*** 将去 /www/web 目录下寻找 store/add-order.html 文件。 ***隐藏网址*** 将 /www/web 目录下和 store/add-order.php 组合成 SCRIPT_FILENAME,传递给php组件。 ***隐藏网址*** ***隐藏网址*** 但是如果 没有写 / 结尾,***隐藏网址******隐藏网址*** location用于匹配url 它进行的是模糊匹配 没有“/”时,location /abc/def可以匹配/abc/defghi请求,也可以匹配/abc/def/ghi等 而有“/”时,location /abc/def/不能匹配/abc/defghi请求,只能匹配/abc/def/anything这样的请求 那么产生的效果如下: ***隐藏网址*** ***隐藏网址*** ***隐藏网址*** ***隐藏网址*** ***隐藏网址*** ***隐藏网址*** ***隐藏网址*** ***隐藏网址***

nginxlocation不包含

nginx中的location指令用于匹配请求的URL路径,并指定该路径所对应的处理程序或配置信息。其中,location指令有两种类型:精确匹配和普通匹配。精确匹配使用“=”符号,表示只有路径完全匹配时才会执行对应的操作;普通匹配则使用“~”、“~*”、“^~”等符号,表示按照一定规则匹配路径。而“不包含”的匹配规则在nginx中并没有直接的指令,但可以使用正则表达式进行实现。例如,下面的location指令表示匹配所有不包含“admin”的路径:```location ~ ^/(?!admin) { # 处理程序或配置信息}```其中,“(?!admin)”表示不包含“admin”的路径。这里使用了“零宽度负预测先行断言”,表示路径中不能包含“admin”,但不会将“admin”作为匹配的一部分。

Nginx Location 正则表达式

部分内容摘抄自 Nginx官网

表示完全匹配规则才执行操作

***隐藏网址***

表示执行正则匹配,但区分大小写

***隐藏网址***

表示执行正则匹配,但 区分大小写

匹配所有url以 jpg、jpeg、gif 结尾时,配置生效。

表示普通字符匹配,前缀匹配有效,配置生效 location ^~ /images/ { }***隐藏网址***

定义一个location,用于处理内部重定向

= ^~ ~/~* (~/~*) 中有多个正则匹配时,选择正则表达式最长的配置执行。

nginx转发配置

顺序 no优先级: ( location = ) 》 ( location 完整路径 ) 》 ( location ^~ 路径 ) 》 ( location ~,~* 正则顺序 ) 》 ( location 部分起始路径 ) 》 ( / )

上面的匹配结果 按照上面的 location 写法,以下的匹配示例成立:

所以实际使用中,个人觉得至少有三个匹配规则定义,如下:

***隐藏网址***

如果相对域名或参数字符串起作用,可以使用全局变量匹配,也可以使用 proxy_pass 反向代理。

表明看 rewrite 和 location 功能有点像,都能实现跳转,主要区别在于 rewrite 是在同一域名内更改获取资源的路径,而 location 是对一类路径做控制访问或反向代理,可以 proxy_pass 到其他机器。很多情况下 rewrite 也会写在 location 里,它们的执行顺序是:

如果其中某步 URI 被重写,则重新循环执行1-3,直到找到真实存在的文件;循环超过10次,则返回 500 Internal Server Error 错误。

因为 301 和 302 不能简单的只返回状态码,还必须有重定向的 URL ,这就是 return 指令无法返回 301 , 302 的原因了。这里 last 和 break 区别有点难以理解:

if判断指令

语法为 if(condition){...} ,对给定的条件 condition 进行判断。如果为真,大括号内的 rewrite 指令将被执行, if 条件 (conditon) 可以是如下任何内容:

-f 和 !-f 用来判断是否存在文件 -d 和 !-d 用来判断是否存在目录 -e 和 !-e 用来判断是否存在文件或目录 -x 和 !-x 用来判断文件是否可执行

例如:

下面是可以用作if判断的全局变量

***隐藏网址*** $host:localhost $server_port : 88 ***隐藏网址*** $document_uri : /test1/test2/test.php $document_root : /var/www/html $request_filename : /var/www/html/test1/test2/test.php

小括号 () 之间匹配的内容,可以在后面通过 $1 来引用, $2 表示的是前面第二个 () 里的内容。正则里面容易让人困惑的是 \ 转义特殊字符。

例1

对形如 /images/ef/uh7b3/test.png 的请求,重写到 /data?file=test.png ,于是匹配到 location /data ,先看 /data/images/test.png 文件存不存在,如果存在则正常响应,如果不存在则重写 tryfiles 到新的 image404 location ,直接返回 404 状态码。

例2

对形如 /images/bla_500x400.jpg 的文件请求,重写到 /resizer/bla.jpg?width=500&height=400 地址,并会继续尝试匹配 location 。

关于nginx的location匹配规则到此分享完毕,希望能帮助到您。

nginx的location匹配规则(nginx 路由配置)

本文编辑:admin
Copyright © 2022 All Rights Reserved 威海上格软件有限公司 版权所有

鲁ICP备20007704号

Thanks for visiting my site.