Nginx重写功能location与rewrite

1. location

从功能看 rewrite 和 location 似乎有点像,都能实现跳转,主要区别在于 rewrite 是在同一域名内更改获取资源的路径,而 location 是对一类路径做控制访问或反向代理,还可以proxy_pass 到其他机器。

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

1.1location类别

精准匹配:location = / {}

一般匹配:location / {}

正则匹配:location ~ / {}

常用正则表达式

匹配符    表示含义
^    匹配输入字符串的起始位置
$    匹配输入字符串的结束位置
*    匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
+    匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”
?    匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}”
.    表示任意一个字符
\转义字符    用于取消特殊符号的含义
\d    匹配纯数字
\s    匹配空的(空格或者制表符)
{n}    匹配前面的子表达式n次
{n,}    匹配前面的子表达式不少于n次
{n,m}    匹配前面的子表达式n到m次
[ ]    匹配括号中的一个字符
[c]    匹配单个字符 c
[a-z]    匹配 a-z 小写字母的任意一个
[a-zA-Z0-9]    匹配所有大小写字母或数字
()    表达式的开始和结束位置
|    或运算符

1.2 常用的匹配规则

规则表达式    规则含义
=    进行普通字符精确匹配。也就是完全匹配
^~    表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其他 location
~    表示执行一个正则匹配,区分大小写
~*    表示执行一个正则匹配,不区分大小写
!~    表示执行一个正则匹配,区分大小写不匹配
!~*    表示执行一个正则匹配,不区分大小写不匹配

1.3 location 优先级

  • 首先精确匹配 =
  • 其次前缀匹配 ^~
  • 其次是按文件中顺序的正则匹配 ~或~*
  • 然后匹配不带任何修饰的前缀匹配
  • 最后是交给 / 通用匹配
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 文件,如果和正则location ~ /images/abc/1.html 相比,正则优先级更高

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

location 匹配
首先看 优先级:精确= > 前缀^~ > 正则~,~* > 一般 > 通用/
优先级相同:正则看上下顺序,上面的优先;一般匹配看长度,最长匹配的优先
精确、前缀、正则、一般 都没有匹配到,最后再看通用匹配

2. rewrite

rewrite功能

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

rewrite只能放在server{},location{},if{}中,并且默认只能对域名后边的除去传递的参数外的字符串起作用,
例如 http://www.kgc.com/abc/bbs/index.php?a=1&b=2 只对/abc/bbs/index.php重写。
 

2.1 rewrite跳转实现

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


2.2 执行顺序

rewrite 执行顺序如下:
(1) 执行 server 块里面的 rewrite 指令。
(2) 执行 location 匹配。
(3) 执行选定的 location 中的 rewrite 指令。

2.3 跳转实现


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

2.4 语法格式

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

3. 实例:

基于域名的跳转
现在公司旧域名www.kgc.com有业务需求变更,需要使用新域名www.benet.com代替,但是旧域名不能废除

修改主配置文件

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

创建所需目录及文件

网页验证

浏览器输入模拟访问 http://www.kgc.com/test/1.html(虽然这个请求内容是不存在的)
会跳转到www.benet.com/test/1.html,查看元素可以看到返回301,实现了永久重定向跳转,而且域名后的参数也正常跳转。

2. 基于客户端 IP 访问跳转
今天公司业务新版本上线,要求所有 IP 访问任何内容都显示一个固定维护页面,只有公司 IP :192.168.66.10访问正常。

vim /usr/local/nginx/conf/nginx.conf
server {listen       80;server_name  www.kgc.com;		#域名修改	charset utf-8;access_log  /var/log/nginx/www.kgc.com-access.log;		#日志修改#设置是否合法的IP标记set $rewrite true;							#设置变量$rewrite,变量值为boole值true#判断是否为合法IPif ($remote_addr = "192.168.66.10"){		#当客户端IP为192.168.80.10时,将变量值设为false,不进行重写set $rewrite false;}#除了合法IP,其它都是非法IP,进行重写跳转维护页面if ($rewrite = true){						#当变量值为true时,进行重写rewrite (.+) /weihu.html;				#将域名后边的路径重写成/weihu.html后转发,例如www.kgc.com/weihu.html}location = /weihu.html {root /var/www/html;						#网页返回/var/www/html/weihu.html的内容}location / {root   html;index  index.html index.htm;}
}

设置维护界面并重启服务

vim /var/www/html/weihu.html

使用192.168.66.20访问时:

使用192.168.66.10访问时

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/636350.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

书生·浦语大模型实战营-学习笔记4

XTuner 大模型单卡低成本微调实战 Finetune简介 常见的两种微调策略&#xff1a;增量预训练、指令跟随 指令跟随微调 数据是一问一答的形式 对话模板构建 每个开源模型使用的对话模板都不相同 指令微调原理&#xff1a; 由于只有答案部分是我们期望模型来进行回答的内容…

蓝桥杯-最少刷题数

&#x1f4d1;前言 本文主要是【算法】——最少刷题数的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句&#x…

一文搞清楚Java中的包、类、接口

写在开头 包、类、接口、方法、变量、参数、代码块&#xff0c;这些都是构成Java程序的核心部分&#xff0c;即便最简单的一段代码里都至少要包含里面的三四个内容&#xff0c;这两天花点时间梳理了一下&#xff0c;理解又深刻了几分。 Java中的包 Java 定义了一种名字空间&…

Centos7系统没有tab补全功能

问题&#xff1a; 新安装的centos7系统在执行命令的时候&#xff0c;没有tab补全命令 解决&#xff1a; 1.安装epel源 yum install -y epel-release 2.安装 bash-completion&#xff0c; bash-completion-extras yum install -y bash-completion bash-completion-extras 3.查…

接口测试 02 -- JMeter入门到实战

前言 JM eter毕竟是做压测的工具&#xff0c;自动化这块还是有缺陷。 如果公司做一些简单的接口自动化&#xff0c;可以考虑使用JMeter快速完成&#xff0c;如果想做完善的接口自动化体系&#xff0c;建议还是基于Python来做。 为什么学习接口测试要先从JMeter开始&#xff1f;…

Python——字符串的基本操作

⼀、 创建 s1 lenovo s2 "QF" s3 """hello lenovo""" s4 hello 亮 s5 """hello shark """ s6 hello world ⼆、简单使⽤ 1.\ 转义符 testimony This shirt doesn\t fit me words hello \ns…

[Linux使用] 库依赖分析 LDD

查看程式运行所需的共享库,常用来解决程序因缺少某个库文件而不能运行的一些问题。 /opt/app/todeav1/test$ldd test libstdc.so.6 > /usr/lib64/libstdc.so.6 (0x00000039a7e00000) libm.so.6 > /lib64/libm.so.6 (0x0000003996400000) libgcc_s.so.1 > /lib64/libg…

json解析

1什么是json JSON(JavaScript Object Notation&#xff0c;JS对象简谱&#xff09;是一种轻量级的数据交换格式。它是基于ECMAScript&#xff08;欧洲计算机协会制定的js规范&#xff09;的一个子集&#xff0c;采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰…

卡尔曼滤波增益推导

该文章主要是记录温习卡尔曼滤波算法理论时的一些理解&#xff0c;重点讲解卡尔曼增益的推导过程。其中忽略了部分基础知识和详细的推导过程&#xff0c;阅读该文章需要本身已具备卡尔曼滤波基础。文章内容摘取自网络博客的部分内容&#xff0c;因为原文章的逻辑不是很通顺&…

pandas中,DataFrame.sample 的理解:

DataFrame.sample 是 pandas 库中 DataFrame 对象的方法&#xff0c;用于从数据框中抽取随机样本。 DataFrame.sample(nNone, fracNone, replaceFalse, weightsNone, random_stateNone, axisNone)n&#xff08;int或None&#xff09;&#xff1a; 指定要抽取的样本数量。如果指…

NLP论文阅读记录 - 2021 | WOS 基于多头自注意力机制和指针网络的文本摘要

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.问题定义和解决问题的假设问题定义解决问题的假设 三.本文方法3.1 总结为两阶段学习3.1.1 基础系统 3.2 重构文本摘要 四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4…

python222网站实战(SpringBoot+SpringSecurity+MybatisPlus+thymeleaf+layui)-帖子详情页实现

锋哥原创的SpringbootLayui python222网站实战&#xff1a; python222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火爆连载更新中... )_哔哩哔哩_bilibilipython222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火…

PiflowX组件-OracleCdc

OracleCdc组件 组件说明 Oracle CDC连接器允许从Oracle数据库读取快照数据和增量数据。 计算引擎 flink 组件分组 cdc 端口 Inport&#xff1a;默认端口 outport&#xff1a;默认端口 组件属性 名称展示名称默认值允许值是否必填描述例子hostnameHostname“”无是Or…

解决一个mysql的更新属性长度问题

需求背景&#xff1a; 线上有一个 platform属性&#xff0c;原有长度为 varchar(10)&#xff0c;但是突然需要填入一个11位长度的值&#xff1b;而偏偏这个属性在线上100张表中有50张都存在&#xff0c;并且名字各式各样&#xff0c;庆幸都包含 platform&#xff1b;例如 platf…

JavaSE核心基础-方法-笔记

1.方法概述 将一些代码抽取出来&#xff0c;放到单独的代码块中&#xff0c;形成方法&#xff0c;可以反复调用。 2.方法的定义格式以及解释 格式&#xff1a; 修饰符 返回值类型 方法名 &#xff08;参数列表&#xff09;&#xff5b; //方法主…

非科班转码的秋招复盘:地理信息科学GIS专业到后端研发、软件开发

本文介绍地理信息科学&#xff08;GIS&#xff09;专业的2024届应届生&#xff0c;在研三上学期期间&#xff0c;寻找后端研发、软件开发等IT方向工作的非科班转码秋招情况。 首先&#xff0c;这篇文章一开始写于2023年年底&#xff0c;当时为了参加一个征文活动&#xff0c;所…

Python爬虫的9个具体应用场景案例分析与具体应用。

文章目录 前言一、新闻采集二、数据挖掘三、网站监测四、舆情分析五、爬虫定制化开发六、数据采集与处理七、网络安全八、网络营销九、自动化测试关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①P…

嵌入式学习-网络编程-Day6

嵌入式学习-网络编程-Day6 一、思维导图 二、作业 1.基于UDP的网络聊天室&#xff08;2024.1.21号前上交&#xff09; 项目需求&#xff1a; 1.如果有用户登录&#xff0c;其他用户可以收到这个人的登录信息 2.如果有人发送信息&#xff0c;其他用户可以收到这个人的群聊信…

LabVIEW振动数据采集与分析系统

在这个项目中&#xff0c; LabVIEW软件配合精确的硬件组件&#xff0c;以实现高效的振动数据采集和复杂信号分析。硬件方面&#xff0c;系统采用了PCB振动加速度传感器的高灵敏度传感器&#xff0c;以及NI9234型号的数据采集卡&#xff0c;确保了数据采集的高精度和可靠性。软件…

Leetcode刷题-(6~10)-Java+Python+JavaScript

算法题是程序员的基本功&#xff0c;也是各个大厂必考察的重点&#xff0c;让我们一起坚持写算法题吧 遇事不决&#xff0c;可问春风&#xff0c;春风不语&#xff0c;即是本心。 我们在我们能力范围内&#xff0c;做好我们该做的事&#xff0c;然后相信一切都事最好的安排就…