Nginx的Location匹配与Rewrite重写

2024-06-04 00:36

本文主要是介绍Nginx的Location匹配与Rewrite重写,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一.Nginx中location与rewrite

1.Nginx中常用正则表达式

2.location与rewrite的联系和区别

二.location概述

1.分类

2.匹配规则

3.优先级

4.示例

三.rewrite概述

1.rewrite功能

2.rewrite执行顺序

3.跳转实现

4.语法格式

5.示例

5.1.基于域名的跳转

5.2.基于旧域名跳转到新域名后面加目录


一.Nginx中location与rewrite

1.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_]
{n}重复 n 次
{n,}重复 n 次或更多次
{n,m}重复 n 到 m 次
[]定义匹配的字符范围
[c]匹配单个字符 c
[a-z]匹配 a-z 小写字母的任意一个
[a-zA-Z0-9]匹配所有大小写字母或数字
()表达式的开始和结束位置
|或运算符

2.location与rewrite的联系和区别

  • rewrite 对访问的域名或者域名内的URL路径地址重写
  • location 对访问的路径做访问控制或者代理转发
     

从功能看 rewrite 和 location 似乎有点像,都能实现跳转,主要区别在于 rewrite 是在同一域名内更

改获取资源的路径,而 location 是对一类路径做控制访问或反向代理,还可以proxy_pass 到其他

机器

二.location概述

1.分类

location 大致可以分为三类

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

2.匹配规则

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

3.优先级

优先级:精准匹配 =  >  最长前缀匹配 ^~  >  正则匹配 ~ ~* !~ !~*  >  一般前缀匹配 /XXXX  >  通用

匹配 /

  • 在没有合适的精准匹配的情况下,先看前缀匹配的长度,取最长匹配的location(如果此最长匹配是带有^~的则不再看正则匹配;如果此最长匹配是不带有^~的则会继续再看正则匹配)
  • 前缀匹配看长度,最长的优先匹配;正则匹配看上下顺序,根据nginx配置文件的配置由上往下依次匹配,匹配到即停止

4.示例

(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 文件,如果和正则location ~ /images/abc/1.html 相比,正则优先级更高

三.rewrite概述

1.rewrite功能

使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向

  • 更换域名后需要保持旧的域名能跳转到新的域名上
  • 某网页发生改变需要跳转到新的页面
  • 网站防盗链等等需求

注意:rewrite只能放在server{},location{},if{}中,并且默认只能对域名后边的除去传递的参数外的

字符串起作用

例如 http://www.xy101.com/abc/bbs/index.php?a=1&b=2 只对/abc/bbs/index.php重写

2.rewrite执行顺序

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

3.跳转实现

  • Nginx:通过ngx_http_rewrite_module 模块支持URL重写、支持if条件判断,但不支持else
  • 跳转:从一个 location跳转到另一个location,循环最多可以执行10次,超过后nginx将返回500错误
  • PCRE支持:perl兼容正则表达式的语法规则匹配
  • 重写模块 set 指令:创建新的变量并设其值

4.语法格式

rewrite <regex> <replacement> [flag];

  • regex :表示正则匹配规则
  • replacement :表示跳转后的内容
  • flag :表示 rewrite 支持的 flag 标记

补充:flag标记说明

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

5.示例

5.1.基于域名的跳转

现在公司旧域名www.xx10.com有业务需求变更,需要使用新域名www.xx11.com代替,但是旧

域名不能废除,需要跳转到新域名上,而且后面的参数保持不变

vim /usr/local/nginx/conf/nginx.conf
server {listen       80;server_name  www.xx10.com;		                      #域名修改	charset utf-8;access_log  /var/log/nginx/www.xx10.com-access.log;  #日志修改location / {#添加域名重定向if ($host = 'www.xx10.com'){					  #$host为rewrite全局变量,代表请求主 机头字段或主机名rewrite ^/(.*)$ http://www.xx11.com/$1 permanent;	#$1为正则匹配的内容,即“域名/”之后的字符串}root   html;index  index.html index.htm;}
}echo "192.168.80.101 www.xx10.com www.xx11.com" >> /etc/hosts
systemctl restart nginx
浏览器输入模拟访问 http://www.xx10.com/test/1.html(虽然这个请求内容是不存在的)
会跳转到www.xx11.com/test/1.html,查看元素可以看到返回301,实现了永久重定向跳转,而且域名后的参数也正常跳转。

5.2.基于旧域名跳转到新域名后面加目录

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

http://www.xx10.com/bbs/post/

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

这篇关于Nginx的Location匹配与Rewrite重写的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1028559

相关文章

解决systemctl reload nginx重启Nginx服务报错:Job for nginx.service invalid问题

《解决systemctlreloadnginx重启Nginx服务报错:Jobfornginx.serviceinvalid问题》文章描述了通过`systemctlstatusnginx.se... 目录systemctl reload nginx重启Nginx服务报错:Job for nginx.javas

centos7基于keepalived+nginx部署k8s1.26.0高可用集群

《centos7基于keepalived+nginx部署k8s1.26.0高可用集群》Kubernetes是一个开源的容器编排平台,用于自动化地部署、扩展和管理容器化应用程序,在生产环境中,为了确保集... 目录一、初始化(所有节点都执行)二、安装containerd(所有节点都执行)三、安装docker-

使用Nginx来共享文件的详细教程

《使用Nginx来共享文件的详细教程》有时我们想共享电脑上的某些文件,一个比较方便的做法是,开一个HTTP服务,指向文件所在的目录,这次我们用nginx来实现这个需求,本文将通过代码示例一步步教你使用... 在本教程中,我们将向您展示如何使用开源 Web 服务器 Nginx 设置文件共享服务器步骤 0 —

一文带你搞懂Nginx中的配置文件

《一文带你搞懂Nginx中的配置文件》Nginx(发音为“engine-x”)是一款高性能的Web服务器、反向代理服务器和负载均衡器,广泛应用于全球各类网站和应用中,下面就跟随小编一起来了解下如何... 目录摘要一、Nginx 配置文件结构概述二、全局配置(Global Configuration)1. w

若依部署Nginx和Tomcat全过程

《若依部署Nginx和Tomcat全过程》文章总结了两种部署方法:Nginx部署和Tomcat部署,Nginx部署包括打包、将dist文件拉到指定目录、配置nginx.conf等步骤,Tomcat部署... 目录Nginx部署后端部署Tomcat部署出现问题:点击刷新404总结Nginx部署第一步:打包

Nginx、Tomcat等项目部署问题以及解决流程

《Nginx、Tomcat等项目部署问题以及解决流程》本文总结了项目部署中常见的four类问题及其解决方法:Nginx未按预期显示结果、端口未开启、日志分析的重要性以及开发环境与生产环境运行结果不一致... 目录前言1. Nginx部署后未按预期显示结果1.1 查看Nginx的启动情况1.2 解决启动失败的

tomcat在nginx中的配置方式

《tomcat在nginx中的配置方式》文章介绍了如何在Linux系统上安装和配置Tomcat,并通过Nginx进行代理,首先,下载并解压Tomcat压缩包,然后启动Tomcat并查看日志,接着,配置... 目录一、下载安装tomcat二、启动tomcat三、配置nginx总结提示:文章写完后,目录可以自动

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

hdu 3065 AC自动机 匹配串编号以及出现次数

题意: 仍旧是天朝语题。 Input 第一行,一个整数N(1<=N<=1000),表示病毒特征码的个数。 接下来N行,每行表示一个病毒特征码,特征码字符串长度在1—50之间,并且只包含“英文大写字符”。任意两个病毒特征码,不会完全相同。 在这之后一行,表示“万恶之源”网站源码,源码字符串长度在2000000之内。字符串中字符都是ASCII码可见字符(不包括回车)。

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter