【Web网站服务】Nginx Rewrite重写模块

news2024/11/16 19:41:28

Nginx Rewrite

  • 一、常用的Nginx 正则表达式
  • 二、location 匹配的范围
    • 2.1location实验
  • 三、rewrite模块
    • 3.1rewrite跳转
    • 3.2rewrite执行顺
    • 3.3flag标记说明
    • 3.4rewrite中常用的全局变量
    • 3.5rewrite实验
      • 3.5.1 基于域名的跳转
      • 3.5.2基于客户端IP访问跳转
      • 3.5.3基于旧域名跳转到新域名后面加目录
      • 3.5.4基于参数匹配的跳转
      • 3.5.5基于目录下所有 php 结尾的文件跳转
      • 3.5.6基于最普通的一跳url请求跳转

一、常用的Nginx 正则表达式

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

  • rewrite 对访问的域名或者域名内的URL路径地址重写

  • location 对访问的路径做访问控制或者代理转发

  • ^ :匹配输入字符串的起始位置 $ :匹配输入字符串的结束位置
  • * :匹配前面的字符零次或多次。如“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] :匹配所有大小写字母或数字
    () :表达式的开始和结束位置
    | :或运算符

二、location 匹配的范围

  • location 大致可以分为三类:
    精准匹配:location = / {…}
    一般匹配:location / {…}
    正则匹配:location ~ / {…}

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

  • location 优先级:
    首先精确匹配 =
    其次前缀匹配 ^~
    其次是按文件中顺序的正则匹配 ~或~*
    然后匹配不带任何修饰符的一般前缀匹配
    最后是交给 / 通用匹配
    在没有精准匹配的情况下,先看前缀匹配的长度,然后根据最长的前缀匹配的优先级去确定是否再去看其它正则匹配location,

  • 如果最长的前缀匹配带有 ^~ 则不再看其它正则匹配location,如果最长的前缀匹配是没有修饰符的一般匹配则会再看其它正则匹配location

  • 前缀匹配看长度,最长的优先匹配
    正则匹配看上下顺序,由上往下依次匹配,当有匹配成功时候,停止匹配,按当前匹配规则处理请求

  • 只有在精准、前缀、正则、一般 都没有匹配到的时候才会看通用匹配

2.1location实验

精确匹配“=”

=为精确匹配 / ,主机名后面不能带任何字符串,比如访问 / 和 /data,则 / 匹配,/data 不匹配

在这里插入图片描述
在这里插入图片描述
前缀匹配

location ^~ /images/ {}
匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条
前缀匹配看长度,最长的优先匹配

在这里插入图片描述
在这里插入图片描述
正则匹配匹配
在这里插入图片描述
在这里插入图片描述

一般匹配

只有在精准、前缀、正则 都没有匹配到的时候才会采用这条匹配,一般匹配看长度,长度越长优先级越高

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

实际网站使用中,至少有三个匹配规则定义:
#第一个必选规则
直接匹配网站根目录首页,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网。
可以是一个静态首页,也可以直接转发给后端应用服务器
location = /index.html {
root html;
index index.html index.htm;
}

#第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用 location ^~ /static/ {
root /webroot/; }

location ~* .(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{}中,并且默认只能对域名后边的除去传递的参数外的字符串起作用,
例如 http://www.kgc.com/abc/bbs/index.php?a=1&b=2 只对/abc/bbs/index.php重写。

3.1rewrite跳转

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

在这里插入图片描述

3.2rewrite执行顺

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

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

3.3flag标记说明

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

3.4rewrite中常用的全局变量

  • $args

变量中存放了请求URL中的请求参数。比如http://192.168.200.133/server?arg1=value1&args2=value2中
的"arg1=value1&arg2=value2",功能和$query_string一样。

  • $http_user_agent

变量存储的是用户访问服务的代理信息(如果通过浏览器访问,记录的是浏览器的相关版本信息)

  • $host

变量存储的是访问服务器的server_name值

  • $document_uri

变量存储的是当前访问地址的URI。比如http://192.168.200.133/server?id=10&name=zhangsan中的"/server",功能和$uri一样

  • $document_root

变量存储的是当前请求对应location的root值,如果未设置,默认指向Nginx自带html目录所在位置

  • $content_length

变量存储的是请求头中的Content-Length的值

  • $content_type

变量存储的是请求头中的Content-Type的值

  • $http_cookie

变量存储的是客户端的cookie信息,可以通过add_header
Set-Cookie’cookieName=cookieValue’来添加cookie数据

  • $limit_rate

变量中存储的是Nginx服务器对网络连接速率的限制,也就是Nginx配置中对limit_rate指令设置的值,默认是0,不限制。

  • $remote_addr

变量中存储的是客户端的IP地址

  • $remote_port

变量中存储了客户端与服务端建立连接的端口号

  • $remote_user

变量中存储了客户端的用户名,需要有认证模块才能获取

  • $scheme

变量中存储了访问协议

  • $server_addr

变量中存储了服务端的地址

  • $server_name

变量中存储了客户端请求到达的服务器的名称

$server_port

变量中存储了客户端请求到达服务器的端口号

  • $server_protocol

  • 变量中存储了客户端请求协议的版本,比如"HTTP/1.1"

  • $request_body_file

变量中存储了发给后端服务器的本地文件资源的名称

  • $request_method

变量中存储了客户端的请求方式,比如"GET","POST"等

  • $request_filename

变量中存储了当前请求的资源文件的路径名

  • $request_uri
    变量中存储了当前请求的URI,并且携带请求参数,比如http://192.168.200.133/server?id=10&name=zhangsan中的"/server?id=10&name=zhangsan"

3.5rewrite实验

3.5.1 基于域名的跳转

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

添加benet.com与kgc.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;
    }
}

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

3.5.2基于客户端IP访问跳转

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

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
    #判断是否为合法IP
	if ($remote_addr = "192.168.243.107"){		#当客户端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;
    }
}

在这里插入图片描述

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

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

vim /usr/local/nginx/conf/nginx.conf
server {
	listen       80;
	server_name  bbs.kgc.com www.kgc.com;		#域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.kgc.com-access.log;
	#添加
	location /post {
        rewrite (.+) http://www.kgc.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.10 bbs.kgc.com"  >> /etc/hosts
systemctl restart nginx
使用浏览器访问 http://bbs.kgc.com/post/1.html 跳转到 http://www.kgc.com/bbs/post/1.html

在这里插入图片描述

3.5.4基于参数匹配的跳转

现在访问http://www.kgc.com/100-(100|200)-100.html 跳转到http://www.kgc.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;
	
	if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {
        rewrite (.+) http://www.kgc.com permanent;
    }

	location / {
        root   html;
        index  index.html index.htm;
    }
}

$request_uri:包含请求参数的原始URI,不包含主机名,如:http://www.kgc.com/abc/bbs/index.html?a=1&b=2 中的 /abc/bbs/index.php?a=1&b=2
$uri:这个变量指当前的请求URI,不包括任何参数,如:/abc/bbs/index.html
d o c u m e n t u r i :与 document_uri:与 documenturi:与uri相同,这个变量指当前的请求URI,不包括任何传递参数,如:/abc/bbs/index.html

在这里插入图片描述

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

需求:要求访问 http://www.kgc.com/upload/123.php 跳转到首页。

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 ~* /upload/.*\.php$ {
        rewrite (.+) http://www.kgc.com permanent;
    }

	location / {
        root   html;
        index  index.html index.htm;
    }
}

在这里插入图片描述

3.5.6基于最普通的一跳url请求跳转

需求: 要求访问一个具体的页面如 http://www.kgc.com/abc/123.html 跳转到首页

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 ~* ^/abc/123.html {
        rewrite (.+) http://www.kgc.com permanent;
    }

	location / {
        root   html;
        index  index.html index.htm;
    }
}

在这里插入图片描述

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

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

相关文章

三、HAL_无源蜂鸣器的驱动

1、开发环境 (1)KeilMDK&#xff1a;V5.38.0.0 (2)STM32CubeMX&#xff1a;V6.8.1 (3)MCU&#xff1a;STM32F407ZGT6 2、无源蜂鸣器简介 无源蜂鸣器内部没有振荡源&#xff0c;需要采用一定频率的方波才能驱动发声。详情参开以下文章。 八、51单片机之蜂鸣器_51蜂鸣器_朱嘉…

DINO代码学习笔记(三)

DINO代码学习笔记&#xff08;一&#xff09;中已经将输入transformer之前的参数处理给捋了一遍 DINO代码学习笔记&#xff08;二&#xff09;中将encoder部分给捋了一遍 本篇进入decoder&#xff0c;这里先对encoder做一些假设&#xff0c;基于DINO代码学习笔记&#xff08;…

使用Harbor 和 Kraken 优化镜像拉取速

一、P2P镜像分发简述 随着云原生架构被越来越多的企业接受&#xff0c;企业应用中容器集群的规模也越来越大。当容器集群达到一定的规模且单容器应用副本数达到一定级别时&#xff0c;集群中容器镜像的分发将面临挑战。   P2P&#xff08;Peer-to-Peer&#xff0c;点对点&am…

股票策略社群实盘展示

量化策略开发&#xff0c;高质量社群&#xff0c;交易思路分享等相关内容 大家好&#xff0c;我是Le Chiffre 从今年1月份开始&#xff0c;我们开始了松鼠股票策略社群&#xff0c;历经5个月&#xff0c;发布了5个策略。其中有2个多因子&#xff0c;2个etf&#xff0c;1个网格…

一款企业级的供应链采购系统,已开源

介绍 基于pig微服务架构打造 供应链系统&#xff0c;采购配送系统。为客户提供仓储管理、订单管理、打单、货源采购、分拣、配送等系统功能。 软件架构 采用 J2EE 技术体系&#xff0c;基于Spring Cloud微服务框架进行封装&#xff0c;平台设计灵活可扩展、可移植、可应对高…

Java使用EasyCode自动生成代码工具分享

此为内容创作模板&#xff0c;在发布之前请将不必要的内容删除 做Java的项目开发&#xff0c;会使用各种代码自动生成工具&#xff0c;今天就来介绍一款EasyCode插件&#xff0c;废话不多说了&#xff0c;看看怎么安装和使用。 一、EasyCode插件 EasyCode的安装 在Idea的Sett…

在云服务器上安装MySQL (MariaDB) 数据库并与Python连接和互动

诸神缄默不语-个人CSDN博文目录 本文介绍如何在云服务器&#xff08;CentOS&#xff09;上安装MySQL数据库&#xff08;其实是MariaDB数据库&#xff0c;但是当成MySQL用也没什么问题&#xff09;&#xff0c;并用pymysql与原生Python代码进行互动&#xff0c;或用Flask-SQLAl…

SpringSecurityOAuth已停更,来看一看进化版本Spring Authorization Server

Spring Authorization Server是Spring Security OAuth的进化版本&#xff0c;Spring Security OAuth官方已经宣布“End of Life”了。Spring Security OAuth使用的是OAuth2.0标准而Spring Authorization Serve引入了对OAuth 2.1和OpenID Connect 1.0规范的支持&#xff0c;并提…

开源赋能 普惠未来|OpenHarmony诚邀您参与2023开放原子全球开源峰会

OpenHarmony面向万物智联&#xff0c;秉持“生态统一、开放共赢”的理念&#xff0c;围绕“架构解耦、弹性部署”“自由流转、智慧协同”和“极简开发、一致体验”三大架构特征&#xff0c;构建分布式全场景协同的开源操作系统基座与生态系统。面向全场景、全连接、全智能时代&…

项目管理工具最新排名出炉,哪款最适合您?

项目管理工具当下已经成为项目团队的重要榜首&#xff0c;一款合适好用的项目管理工具可以帮助处理很多机械化工作&#xff0c;将管理者更多精力投入到更有价值的工作中&#xff0c;还可以帮助团队组织和计划项目&#xff0c;跟踪进度&#xff0c;处理预算和协作。 该如何挑选帮…

程序员必须掌握的消息中间件-RocketMQ

设计(design) 1 消息存储 消息存储是RocketMQ中最为复杂和最为重要的一部分&#xff0c;本节将分别从RocketMQ的消息存储整体架构、PageCache与Mmap内存映射以及RocketMQ中两种不同的刷盘方式三方面来分别展开叙述。 1.1 消息存储整体架构 消息存储架构图中主要有下面三个跟消息…

在centos7.9上以 All-in-One 模式安装 KubeSphere

文章目录 前言一、什么是 KubeSphere&#xff1f;二、环境准备1.虚拟机准备2.基础环境准备3.安装docker服务4.下载KubeKey安装工具5.开始安装6.安装结束&#xff0c;登陆验证 总结 前言 在centos7.9上以 All-in-One 模式安装 KubeSphere&#xff0c;在虚拟机上安装 一、什么是…

ABeam×Startup丨德硕管理咨询(深圳)创新研究团队拜访「超次元」,探索元宇宙

右一&#xff1a;超次元商务总监 卢佩瑜 左一、中&#xff1a;ABeam-SZ StartUp创新研究团队 ABeam旗下德硕管理咨询&#xff08;深圳&#xff09;有限公司&#xff08;以下简称“ABeam-SZ”&#xff09;创新研究团队一行前往广州&#xff0c;拜访了海南超次元数码科技有限公司…

【Linux】Centos7下给新用户添加sudo权限

直入正题&#xff1a; 我们用adduser创建新用户后&#xff0c;这个新用户是没有使用sudo的权限的。 比如我们创建一个新用户fortest&#xff1a; 这个用户是没有使用sudo的权限的&#xff1a; 我们可以在root下修改&#xff08; /etc/sudoers &#xff09;这个路径下的文件su…

实用工具篇(二):终端连接神器Tabby

1.Tabby概述 一名 Java 后端开发&#xff0c;日常工作中免不了要和 Linux 服务器打交道&#xff0c;因为生产环境基本上都是部署在 Linux 环境下的。以前我使用的终端工具都是FinalShell&#xff0c;但我又发现一款更好更方便的终端工具---Tabby。下面将介绍这款终端工具的安装…

11.动态规划:树形DP问题、树上最大独立集【灵神基础精讲】

文章目录 树形DP问题一、树的直径&#xff08;二叉树>一般树&#xff09;[543. 二叉树的直径](https://leetcode.cn/problems/diameter-of-binary-tree/)[124. 二叉树中的最大路径和](https://leetcode.cn/problems/binary-tree-maximum-path-sum/)&#x1f3b1;(树的直径)[…

机器学习常识 20: 全连接 BP 神经网络

摘要: BP (Backpropagation ) 神经网络是一个万能的函数模拟器. 所有的神经网络, 本质都是特征提取器 – 斯 ⋅ \cdot ⋅沃索地. 1. BP 神经网络的结构 图 1 给出一个四层神经网络. 输入层有 3 个端口, 表示数据有 3 个特征;第一个隐藏层有 5 个节点, 表示从 3 个特征提出了…

hdfs中acl权限管理的简单实用

1、背景 在我们开发的过程中有这么一种场景&#xff0c; /projectA 目录是 hadoopdeploy用户创建的&#xff0c;他对这个目录有wrx权限&#xff0c;同时这个目录属于supergroup&#xff0c;在这个组中的用户也具有这个目录的wrx权限&#xff0c;对于其他人,不可访问这个目录。…

[时间同步]NTPPTPgPTP

为什么时间同步很重要&#xff1f; 出于诸多原因&#xff0c;精确的时间对于网络至关重要&#xff0c;比如&#xff1a; 网络管理&#xff1a;从不同网络设备采集来的日志信息进行分析时&#xff0c;需要以时间作为参照依据。如果不同设备上的系统时间不一致&#xff0c;会因…

Docker 容器互联

-v 宿主机与容器互联 第一步在本机建立共享目录&#xff1a;share 第二步创建容器&#xff0c;将容器opt目录挂载到本机的/opt/share目录上 -v 宿主机目录/文件:容器目录/文件 #将宿主机目录/文件挂载到容器做数据卷 这个时候test1 /opt和本机/opt/share已经可以实现共享 …