Location匹配与Rewrite重写

这篇具有很好参考价值的文章主要介绍了Location匹配与Rewrite重写。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、常见的Nginx正则表达式

^ :匹配输入字符串的起始位置
$ :匹配输入字符串的结束位置
* :匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
+ :匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”
? :匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}”
. :匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]”之类的模式
\ :将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一个换行符,而“\$”则匹配“$”
\d :匹配纯数字[0-9]  \s:空白符  \w:任意单词字符包括下划线[a-zA-Z0-9_]
[list] :匹配list列表中的一个字符,例: go[ola]d, [abc]、 [a-z]、 [a-z0-9]、 [0-9]匹配任意一位数字
[^list] :匹配任意非list列表中的一个字符,例: [^0-9]、 [^A-20-9]、 [^a-z]匹配任意一位非小写字母
{n} :重复 n 次
{n,} :重复 n 次或更多次
{n,m} :重复 n 到 m 次
[] :定义匹配的字符范围
[c] :匹配单个字符 c
[a-z] :匹配 a-z 小写字母的任意一个
[a-zA-Z0-9] :匹配所有大小写字母或数字
() :表达式的开始和结束位置
| :或运算符

二、Location匹配

1.location大致可以分为三类:

精准匹配:location = / {}
一般匹配:location / {}
正则匹配:location ~ / {}

2.location常用的匹配规则: 

= :进行普通字符精确匹配,也就是完全匹配。
^~ :表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其它 location。
~ :区分大小写的匹配。
~* :不区分大小写的匹配。
!~ :区分大小写的匹配取非。
!~* :不区分大小写的匹配取非。

3.location 优先级

 首先精确匹配 =
其次前缀匹配 ^~
其次是按文件中顺序的正则匹配 ~或~*
然后匹配不带任何修饰的前缀匹配(一般匹配)
最后是交给 / 通用匹配
优先级总结:
1.(location = 完整路径)>(location ^~路径)>(location ~,~* 正则顺序)>(location 部分起始部分)>(location /)
2.优先级相同,正则看上下顺序,上面的优先;一般匹配看长度,最长匹配优先

 4.location 示例说明

(1)location = / {}
=为精确匹配 / ,主机名后面不能带任何字符串,比如访问 / 和 /data,则 / 匹配,/data 不匹配
再比如 location = /abc,则只匹配/abc ,/abc/或 /abcd不匹配。若 location  /abc,则即匹配/abc 、/abcd/ 同时也匹配 /abc/。
 
(2)location / {}
因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 比如访问 / 和 /data, 则 / 匹配, /data 也匹配,
但若后面是正则表达式会和最长字符串优先匹配(最长匹配)
 
(3)location /documents/ {}
匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索其它 location
只有其它 location后面的正则表达式没有匹配到时,才会采用这一条
 
(4)location /documents/abc {}
匹配任何以 /documents/abc 开头的地址,匹配符合以后,还要继续往下搜索其它 location
只有其它 location后面的正则表达式没有匹配到时,才会采用这一条
 
(5)location ^~ /images/ {}
匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条
 
(6)location ~* \.(gif|jpg|jpeg)$ {}
匹配所有以 gif、jpg或jpeg 结尾的请求
然而,所有请求 /images/ 下的图片会被 location ^~ /images/ 处理,因为 ^~ 的优先级更高,所以到达不了这一条正则
 
(7)location /images/abc {}
最长字符匹配到 /images/abc,优先级最低,继续往下搜索其它 location,会发现 ^~ 和 ~ 存在
 
(8)location ~ /images/abc {}
匹配以/images/abc 开头的,优先级次之,只有去掉 location ^~ /images/ 才会采用这一条
 
(9)location /images/abc/1.html {}
匹配/images/abc/1.html 文件,如果和正则 ~ /images/abc/1.html 相比,正则优先级更高
 
优先级总结:
(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (location /)

实际网站使用中,至少有三个匹配规则定义

第一个必选规则

直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网 这里是直接转发给后端应用服务器了,也可以是一个静态首页

location ^~ /static/ {
    root /webroot/static/;
}
 
location ~* \.(html|gif|jpg|jpeg|png|css|js|ico)$ {
    root /webroot/res/;
}

第二个必选规则

处理静态文件请求,这是nginx作为http服务器的强项 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用

location ^~ /static/ {
    root /webroot/static/;
}
 
location ~* \.(html|gif|jpg|jpeg|png|css|js|ico)$ {
    root /webroot/res/;
}

第三个规则

通用规则,比如用来转发带.php、.jsp后缀的动态请求到后端应用服务器 非静态文件请求就默认是动态请求

location / {
    proxy_pass http://tomcat_server;
}

三、rewrite

  rewrite功能就是使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记实现URL重写以及重定向。
        例如:更换域名后需要保持旧的域名能够转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求。

   注意:rewrite只能放在server{},location{},if{}中,并且默认只能对域名后面的除去传递的参数外的字符串起作用。 

rewrite 跳转实现

Nginx:通过ngx_http_rewrite_module模块支持URL重写、支持if条件判断,但不支持else

跳转:从一个location跳转到另一个location,循环最多可以执行10次,超过后nginx将返回500错误

PCRE支持:perl兼容正则表达式的语法规则匹配

重写模块set指令:创建新的变量并为其赋值

rewrite执行顺序
1.执行server块里面的rewrite指令
2.执行location匹配
3.执行选定的location中的rewrite指令

rewrite语法格式

语法rewrite<regex><replacement><flag>;
regex : 表示正则匹配规则
replacement : 表示跳转后的内容
flag : 表示rewrite支持的flag标记

flag标记说明

last : 本条规则匹配完成后,继续向下匹配新的location URI规则,一般用在 server 和 if 中。
break : 本条规则匹配完成即终止,不再匹配后面的任何规则,一般使用在 location 中。
redirect : 返回302临时重定向,浏览器地址会显示跳转后的URL地址。
permanent : 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。
 

rewrite 示例

1)基于域名的跳转

现在公司旧域名www.test.com有业务需求变更,需要使用新域名www.lisi.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。

vim /usr/local/nginx/conf/nginx.conf
server {
	listen       80;
	server_name  www.test.com;  #域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.test.com.access.log; #日志修改
	location / { 
	    if ($host = 'www.test.com'){    #$host为rewrite全局变量,代表请求主机头字段或主机名
	        rewrite ^/(.*)$ http://www.lisi.com/$1 permanent;   #$1为正则匹配的内容,即域名后边的字符串
	    }
        root   html;
        index  index.html index.htm;
    }
}
 
echo "192.168.50.26 www.lisi.com www.test.com" >> /etc/hosts
systemctl restart nginx

2)基于客户端 IP 访问跳转

今天公司业务新版本上线,要求所有 IP 访问任何内容都显示一个固定维护页面,只有公司 IP:192.168.50.26访问正常

vim /usr/local/nginx/conf/nginx.conf
server {
	listen       80;
	server_name  www.test.com;
	charset utf-8;
	access_log  /var/log/nginx/www.test.com.access.log;
 
	#设置是否合法的IP标记;设置变量$rewrite,变量值为boole值true
    set $rewrite true;
    #判断是否为合法IP;当客户端IP为192.168.50.26时,将变量值设为false,不进行重写
    if ($remote_addr = "192.168.50.26"){
        set $rewrite false;
    }
	#除了合法IP,其它都是非法IP,进行重写跳转维护页面
	#当变量值为true时,进行重写
    if ($rewrite = true){
        #重写在访问IP后边插入/weihu.html,例如192.168.50.11/weihu.html
        rewrite (.+) /weihu.html;
    }
    location = /weihu.html {
        #网页返回/var/www/html/weihu.html的内容
        root /var/www/html;
    }
	location / {
        root   html;
        index  index.html index.htm;
    }
}
 
mkdir -p /var/www/html/
echo "As server maintenance, please visit later, thank you." > /var/www/html/weihu.html
echo "192.168.50.26 www.test.com" >> /etc/hosts
systemctl restart nginx

3)基于旧域名跳转到新域名后面加目录

现在访问的是 http://lisi.test.com,现在需要将这个域名下面的访问都跳转到http://www.test.com/lisi

vim /usr/local/nginx/conf/nginx.conf
server {
	listen       80;
	server_name  lisi.test.com;
	charset utf-8;
	access_log  /var/log/nginx/lisi.test.com.access.log;
	#添加;这里的$1为位置变量,代表/post
	location /post {
        rewrite (.+) http://www.test.com/lisi$1 permanent;
    }
	location / {
        root   html;
        index  index.html index.htm;
    }
}
 
mkdir -p /usr/local/nginx/html/lisi/post
echo "this is 1.html" > /usr/local/nginx/html/lisi/post/1.html
echo "192.168.50.26 lisi.test.com www.test.com" >> /etc/hosts
systemctl restart nginx.service
使用浏览器访问
http://lisi.test.com/post/1.html 跳转到 http://www.test.com/lisi/post/1.html

4)基于参数匹配的跳转

现在访问http://www.test.com/100-(100|200)-100(任意数字).html 跳转到http://www.test.com页面

vim /usr/local/nginx/conf/nginx.conf
server {
	listen       80;
	server_name  www.test.com;
	charset utf-8;
	access_log  /var/log/nginx/www.test.com.access.log;
 
    if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {
        rewrite (.+) http://www.test.com permanent;
    }
 
    location / {
        root   html;
        index  index.html index.htm;
    }
}
 
echo "192.168.50.26 www.test.com" >> /etc/hosts
systemctl restart nginx
 
浏览器访问
http://www.test.com/100-200-100.html 或 
http://www.test.com/100-100-100.html 跳转到http://www.test.com页面。

5)基于目录下所有 php 结尾的文件跳转

要求访问 http://www.test.com/upload/123.php 跳转到首页。文章来源地址https://www.toymoban.com/news/detail-639753.html

vim /usr/local/nginx/conf/nginx.conf
server {
	listen       80;
	server_name  www.test.com;
	charset utf-8;
	access_log  /var/log/nginx/www.test.com.access.log;
	
location ~* /upload/.*\.php$ {
    rewrite (.+) http://www.test.com permanent;
}
 
location / {
    root   html;
    index  index.html index.htm;
}
}
 
echo "192.168.50.26 www.test.com" >> /etc/hosts
systemctl restart nginx
 
浏览器访问
http://www.test.com/upload/abc.php 跳转到http://www.test.com页面。

到了这里,关于Location匹配与Rewrite重写的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 重写 Nacos 服务发现:多个服务器如何跨命名空间,访问公共服务?

    在开发某个公共应用时,笔者发现该公共应用的数据是所有测试环境(假设存在 dev/dev2/dev3)通用的。 这就意味着只需部署一个应用,就能满足所有测试环境的需求;也意味着所有测试环境都需要调用该公共应用,而不同测试环境的应用注册在不同的 Nacos 命名空间。 如果所

    2024年02月04日
    浏览(50)
  • 重写Nacos服务发现:多个服务器如何跨命名空间,访问公共服务?

    在开发某个公共应用时,笔者发现该公共应用的数据是所有测试环境(假设存在 dev/dev2/dev3)通用的。 这就意味着只需部署一个应用,就能满足所有测试环境的需求;也意味着所有测试环境都需要调用该公共应用,而不同测试环境的应用注册在不同的 Nacos 命名空间。 如果所

    2024年02月05日
    浏览(53)
  • unix网络编程-简易服务器与客户端程序解析

    a -- address f -- file        eg: fputs() -- file put stream fd -- file descriptor h - host(主机) in/inet -- internet        eg: sockaddr_in; inet_aton n -- network(网络字节序)/numeric(数值) p -- protocol(协议)/presentation(表达/呈现形式) s -- socket        eg: sin -- socket internet t -- type,用于指定某种

    2024年01月16日
    浏览(69)
  • 一、重写muduo网络库之服务器编程及测试

    目录 一、基于muduo网络库开发服务器程序的基本步骤 1、组合TcpServer对象 2、创建EventLoop事件循环对象的指针 3、明确TCPServer构造函数需要的参数,输出ChatServer的构造函数 4、在当前服务器类的构造函数当中,注册处理连接的回调函数和处理读写事件的回调函数 5、设置合适的

    2024年02月04日
    浏览(41)
  • Go重写Redis中间件 - GO实现TCP服务器

    首先新建一个项目go-redis,将config和lib包放到项目中,config.go用来解析配置,比如端口、功能、DB数;lib包有两个文件夹,分别是logger和sync,其中logger.go是一个日志框架,sync包中的bool.go包装了atomic操作,因为atomic原生没有bool类型,所以将uint32类型改造成bool型的atomic,wait.g

    2024年02月15日
    浏览(83)
  • UNIX网络编程卷一 学习笔记 第三十章 客户/服务器程序设计范式

    开发一个Unix服务器程序时,我们本书做过的进程控制: 1.迭代服务器(iterative server),它的适用情形极为有限,因为这样的服务器在完成对当前客户的服务前无法处理已等待服务的新客户。 2.并发服务器(concurrent server),为每个客户调用fork派生一个子进程。传统上大多U

    2024年02月09日
    浏览(50)
  • 重写Sylar基于协程的服务器(7、TcpServer & HttpServer的设计与实现)

    重写Sylar基于协程的服务器系列: 重写Sylar基于协程的服务器(0、搭建开发环境以及项目框架 || 下载编译简化版Sylar) 重写Sylar基于协程的服务器(1、日志模块的架构) 重写Sylar基于协程的服务器(2、配置模块的设计) 重写Sylar基于协程的服务器(3、协程模块的设计) 重写

    2024年02月21日
    浏览(36)
  • 重写Sylar基于协程的服务器(0、搭建开发环境以及项目框架 || 下载编译简化版Sylar)

    重写Sylar基于协程的服务器系列: 重写Sylar基于协程的服务器(0、搭建开发环境以及项目框架 || 下载编译简化版Sylar) 重写Sylar基于协程的服务器(1、日志模块的架构) 重写Sylar基于协程的服务器(2、配置模块的设计) 重写Sylar基于协程的服务器(3、协程模块的设计) 重写

    2024年04月26日
    浏览(34)
  • location模块与rewrite重定向

    目录 location 常用的nginx正则表达式 URI location分类 location常用的匹配规则 location优先级 location实例说明 优先级总结 在实际网站中使用的匹配规则至少有三个匹配规则 rewrite rewrite执行顺序 nginx的内置变量 ^:匹配输入字符串的起始位置 $:匹配输入字符串的结束位置 *:匹配前面

    2024年02月13日
    浏览(35)
  • NVIDIA GPU 与服务器型号匹配查询

    https://www.nvidia.cn/data-center/data-center-gpus/qualified-system-catalog/ https://www.nvidia.com/en-us/data-center/data-center-gpus/qualified-system-catalog/ 确保服务器与 NVIDIA GPU 匹配运行。 符合特定 NVIDIA GPU 要求的服务器已通过散热、规格尺寸、功率和信号完整性认证,以确保 GPU 在该服务器设计中能够正

    2024年02月03日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包