Rewrite功能配置

news2025/1/24 11:34:25

Rewrite

Rewrite是Nginx服务器提供的一个重要基本功能。主要的作用是用来实现URL的重写。
Nginx服务器的Rewrite功能的实现依赖于PCRE的支持,因此在编译安装Nginx服务器之前,需要安装PCRE库。

Nginx使用的是ngx_http_rewrite_module模块来解析和处理Rewrite功能的相关配置。

Rewrite规则
set

该指令用来设置一个新的变量。

指令set $variable value;
默认值无默认值
位置http, server, location
用途设置或修改变量的值

variable:变量的名称,该变量名称要用"$"作为变量的第一个字符,且不能与Nginx服务器预设的全局变量同名。
value:变量的值,可以是字符串、其他变量或者变量的组合等。

server {
        listen 8082;
        server_name 127.0.0.1;
        location /server {
                root /usr/local/nginx/html;
                set $name Jack; #设置值
                set $age 20;
          
                default_type text/plain;
        return  200 $name=$age=$args=$http_user_agent=$host=$document_root; #返回值输出

        }
    }

访问测试
在这里插入图片描述

args表示浏览器中?后面的值,如果加上就会展示出来
200 n a m e = name= name=age= a r g s = args= args=http_user_agent= h o s t = host= host=document_root;
上面的例子中输出了":2"

Rewrite常用全局变量
变量说明
$args请求URL中的查询字符串部分,例如 “arg1=value1&args2=value2”。
$http_user_agent客户端请求头中的User-Agent字段,记录浏览器版本信息等。
$host访问服务器的Host头的值,例如 “192.168.101.20:8080”。
$document_uri当前请求的URI,不包含查询字符串,例如 “/server”。
$document_root当前请求对应location的root值,未设置时指向Nginx默认目录。
$content_length请求头中的Content-Length字段,表示请求体的大小。
$content_type请求头中的Content-Type字段,表示请求体的媒体类型。
$http_cookie客户端的Cookie信息,可通过add_header Set-Cookie添加。
$limit_rateNginx对网络连接速率的限制值,0表示不限制。
$remote_addr客户端的IP地址,例如 “192.168.101.20”。
$remote_port客户端与服务端建立连接的端口号。
$remote_user客户端的用户名,需要认证模块支持。
$scheme访问协议,例如 “http” 或 “https”。
$server_addr服务端监听的地址。
$server_name客户端请求到达的服务器名称。
$server_port客户端请求到达服务器的端口号。
$server_protocol客户端请求协议的版本,例如 “HTTP/1.1”。
$request_body_file发给后端服务器的请求体的本地临时文件名。
$request_method客户端的请求方式,如 “GET” 或 “POST”。
$request_filename当前请求的资源文件的完整路径名。
$request_uri当前请求的完整URI,包含请求参数,例如 “/server?id=10&name=lisi”。
if指令

该指令用来支持条件判断,并根据条件判断结果选择不同的Nginx配置。

指令if
默认值无默认值
位置http, server, location
用途根据条件包含或排除配置
if ($param){
    
}

使用"=“和”!="比较变量和字符串是否相等,满足条件为true,不满足为false

if ($request_method = POST){
    return 405;
}

判断args是否有值,如果有则返回200 success 。如果第一个条件不满足条件则判断是否为POST请求,如果是则返回405。都不匹配返回200 error

location /testif {
   
        default_type text/plain;
        if ($args){
            return 200 success;
         }
         if ($request_method = POST){
            return 405;
         }
        return 200 error;
        }

浏览器测试
添加args参数
在这里插入图片描述
不添加args参数
在这里插入图片描述
使用post请求测试
cmd执行 curl -X POST http://192.168.101.23:8082/testif
POST请求
在这里插入图片描述
返回405,对应nginx的判断

用正则表达式对变量进行匹配,匹配成功返回true,否则返回false。
"~"代表匹配正则表达式过程中区分大小写,
"~*"代表匹配正则表达式过程中不区分大小写
"!“和”!*"和上面取相反值,如果匹配上返回false,匹配不上返回true

#$http_user_agent的值中是否包含Mozilla字符串,如果包含返回true
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
注意:正则表达式字符串一般不需要加引号,但是如果字符串中包含"}“或者是”;"等字符时,就需要把引号加上。

~* 忽略大小写
在这里插入图片描述

!~ 取反 不匹配条件
在这里插入图片描述
在这里插入图片描述

!~ 不区分大小写*
在这里插入图片描述
在这里插入图片描述

判断请求的文件是否存在使用"-f"和"!-f".
当使用"-f"时,如果请求的文件存在返回true,不存在返回false。
当使用"!f"时,如果请求文件不存在,但该文件所在目录存在返回true,文件和目录都不存在返回false,如果文件存在返回false

location / {
            root html;
            default_type text/html;
            if (!-f $request_filename){
                    return 200 '<h1>file not found</h1>';
            }
        }

访问存在的页面
在这里插入图片描述

访问不存在的页面
在这里插入图片描述

判断请求的目录是否存在使用"-d"和"!-d"
当使用"-d"时,如果请求的目录存在,if返回true,如果目录不存在则返回false
当使用"!-d"时,如果请求的目录不存在但该目录的上级目录存在则返回true,该目录和它上级目录都不存在则返回false,如果请求目录存在也返回false.

判断请求的目录或者文件是否存在使用"-e"和"!-e"
当使用"-e",如果请求的目录或者文件存在时,if返回true,否则返回false.
当使用"!-e",如果请求的文件和文件所在路径上的目录都不存在返回true,否则返回false

判断请求的文件是否可执行使用"-x"和"!-x"
当使用"-x",如果请求的文件可执行,if返回true,否则返回false
当使用"!-x",如果请求文件不可执行,返回true,否则返回false

break指令

中断当前相同作用域中的其他Nginx配置

  • break 指令会中断当前 location 或 if 块中的其他配置指令的执行。
  • 位于 break 指令前面的配置指令会生效,而位于其后的配置指令不会被执行。
    终止当前的匹配并在本 location 中处理当前 URI:
  • break 指令会终止当前的匹配过程,而不会再继续其他 location 块的匹配。
  • break 会使用修改后的 URI 在当前的 location 块中继续处理,而不是进行重定向。
指令break
默认值无默认行为
位置location block
用途终止当前 location block 中的后续指令执行
location /testbreak {
                default_type text/plain;
                set $username JACK; #设置username 的初始值
                if ($args){ #如果有参数这输出WADE
                        set $username WADE;
                        break;
                        set $username WAYNE;#break后的执行永远都不会被执行
                }
                add_header username $username;
                return 200 $username;
        }

测试不加参数访问
在这里插入图片描述
添加参数值访问
在这里插入图片描述
提示没有对应的文件,因为对testbreak重定向处理了,但是没有相应的文件夹所以提示错误了。
在这里插入图片描述

在html下建立testbreak文件夹并添加Index.html(如果没有指定index.html nginx会默认根据当前目录下找index.html)
index.html

<html>
        <head>
                <title>index.html</title>
        </head>
        <body>
                <h1>testbreak index.html</h1>
        </body>
</html>

添加完成后再次添加参数测试
在这里插入图片描述
在这里插入图片描述

return指令

return 指令在 Nginx 配置中用于立即终止请求处理并返回指定的状态码和可选的响应体。

指令return
默认值无默认值
位置server、location、if
用途直接返回给客户端指定的HTTP状态码和可选的响应页面或文本

返回类型
code:返回给客户端的HTTP状态代理。可以返回的状态代码为0~999的任意HTTP状态代理
text:返回给客户端的响应体内容,支持变量的使用
URL:返回给客户端的URL地址
json:返回json格式给客户端

 location /testreturn {
                default_type application/json;
                return 200 '{id:"1",name:"jack"}';

        }

在这里插入图片描述

url:

 location /testreturn {
            #default_type application/json;
            #return 200 '{id:"1",name:"jack"}';
            return https://www.baidu.com;
        }

返回状态码:

location /testreturn {
            #default_type application/json;

            return 302 https://www.baidu.com;
        }

在这里插入图片描述
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b86e4158bf964fd6a965adc9ffee109d.png

rewrite指令
该指令通过正则表达式的使用来改变URI。可以同时存在一个或者多个指令,按照顺序依次对URL进行匹配和处理。

指令rewrite
语法rewrite regex replacement [flag];
默认值
位置server block, location block
用途重写请求的URI或设置变量

flag是可选的标志,如last、break、redirect或permanent。

URL和URI的区别:

  • URI:统一资源标识符
  • URL:统一资源定位符

replacement:匹配成功后,用于替换URI中被截取内容的字符串。如果该字符串是以"http://"或者"https://"开头的,则不会继续向下对URI进行其他处理,而是直接返回重写后的URI给客户端。

location /rewrite {
        rewrite ^/rewrite/url\w*$ htts://www.baidu.com; #“^”表示正则表达式的开始 “rewrite”是路径 “url”表示要匹配的字符串,
                                                        #“\w”表示匹配任意数字和字母以及下划线 “$”表示以前面的字符结尾 最后写上跳转的地址
        rewrite ^/rewrite/(test)\w*$ /$1; #“(test)”表示要匹配的内容,  "$1"表示括号里的test,相当于要重写的url "test"就是下面location 中的/test
        rewrite ^/rewrite/(demo)\w*$ /$1; # 
}

location /test {  # 要被跳转的test location
        default_type text/plain;
        return 200 test_success;

}

location /demo { # 要被跳转的demo location
        default_type text/plain;
        return 200 demo_success;
}

1.匹配第一个rewrite 跳转到百度
在这里插入图片描述
在这里插入图片描述
2.匹配第二个rewrite test
在这里插入图片描述
3.匹配第三个rewrite demo
在这里插入图片描述

flag:用来设置rewrite对URI的处理行为,可选值有如下:

  • last
  • last 标志告诉 Nginx 在完成当前的重写后,停止执行当前 location 块内的所有后续重写规则,并立即使用新的 URI 进行处理。
    (url重写后,马上发起一个新的请求,再次进入server块,重试location匹配,超过10次匹配不到则报500错误,地址栏url不变)
    (停止当前这个请求,并根据rewrite匹配的规则重新发起一个请求。新请求又从第一阶段开始执行…)
rewrite ^/rewrite/(test)\w*$ /$1 last;
rewrite ^/rewrite/(demo)\w*$ /$1 last;

break
将此处重写的URI作为一个新的URI,在本块中继续进行处理。该标志将重写后的地址在当前的location块中执行,不会将新的URI转向其他的location块。使用break后会将http://192.168.101.23:8082/rewrite/test后面的路径去重新匹配,“test”或"demo"将作为一个文件夹匹配,默认nginx回去寻找对应文件夹下的index.html

rewrite ^/rewrite/(test)\w*$ /$1 break;
rewrite ^/rewrite/(demo)\w*$ /$1 break; 

redirect

  • 将重写后的URI返回给客户端,状态码为302,指明是临时重定向URI,主要用在replacement变量不是以”http://"或者”https://"开头的情况。

  • 在这里插入图片描述

permanent
permanent 标志与 redirect 类似,但它返回 HTTP 301 永久重定向状态码。

永久重定向和临时重定向的区别:
永久重定向:如果要重定向的资源是永久的,就使用permanent 。
临时重定向:如果要重定向的资源是临时的,就使用redirect 。

rewrite_log指令

该指令配置是否开启URL重写日志的输出功能。

指令rewrite_log on|off;
默认值off
位置http, server, location
用途开启或关闭重写规则的日志记录,以便于调试和跟踪

开启后,URL重写的相关日志将以notice级别输出到error_log指令配置的日志文件汇总。

location /rewrite {
        rewrite_log on;
        error_log logs/error.log notice; #需要更改日志级别才能输出到error.log
        #rewrite ^/rewrite/\w*$ https://www.baidu.com;
        rewrite ^/rewrite/(.*)\w*$ /$1 permanent;
        rewrite ^/rewrite/(.*)\w*$ /$1 permanent;
}

在这里插入图片描述

Rewrite案例

域名跳转
有三个域名,浏览器输入他们后都会调整到www.home.com域名。例如有下面三个域名
www.home.com | www.home.cn | www.89home.com

修改host文件映射
vim /etc/hosts

127.0.0.1 www.home.com
127.0.0.1 www.home.cn
127.0.0.1 www.89home.com

在/usr/local/nginx/html/home目录下创建一个访问页面

<html>
        <title></title>
<body>
                <h1>welecome to home!</h1>
        </body>
</html>

通过Nginx实现当访问www.访问到系统的首页
server_name 指令在 Nginx 配置中用于定义当前 server 块应响应的域名列表。当一个请求到达 Nginx 时,Nginx 会检查请求的 Host 头部信息,并尝试匹配一个 server 块的 server_name 指令,以确定将请求转发到哪个 server 块进行处理。

 server {
        listen 80;
        server_name www.home.com;
        location / {
                root html/home;
                default_type text/html;

        }
        index index.html;
   }


   server {
        listen 80;
        server_name www.home.cn www.89home.com;
        rewrite ^/ http://www.home.com; 

通过Rewrite将www.home.cn www.89home.com 跳转到www.home.com首页。

访问测试。访问www.89home.com
.在这里插入图片描述
跳转到www.home.com
在这里插入图片描述

域名跳转的过程中携带请求的URI

例如:www.89home.com/findById 跳转后 http://www.home.com/findById

server {
        listen 80;
        server_name www.home.cn www.89home.com;
        #rewrite ^/ http://www.home.com;
        rewrite ^(.*)  http://www.home.com$1; #^(.*)表示请求的URI $1表示前面括号里面的内容
   }
域名镜像

上述案例中,将www.home.cn www.89home.com都能跳转到www.home.com,那么
www.home.com我们就可以把它起名叫主域名,其他两个就是我们所说的镜像域名,当然如果我们不想把整个网站做镜像,只想为其中某一个子目录下的资源做镜像,我们可以在location块中配置rewrite功能,比如:

 listen 80;
        server_name www.home.cn www.89home.com;
 

        location /user {
                rewrite ^/user(.*)$ http://www.home.com$1; #以user开头的都进行跳转 
        }
        location /emp {
                default_type text/html;
                return 200 '<h1>emp_success</h1>';
        }
   }

在这里插入图片描述
跳转后
在这里插入图片描述

独立域名

一个完整的项目包含多个模块,比如购物网站有商品商品搜索模块、商品详情模块已经购物车模块等,那么我们如何为每一个模块设置独立的域名。
http://search.home.com 访问商品搜索模块
http://item.home.com 访问商品详情模块
http://cart.home.com 访问商品购物车模块

在这里插入图片描述
对应页面的index.html
搜索页


```html
<html>
        <title></title>
<body>
                <h1>search page!</h1>
        </body>
</html>

购物车页

<html>
        <title></title>
<body>
                <h1>cart page!</h1>
        </body>
</html>

index页

<html>
        <title></title>
<body>
                <h1>index page!</h1>
        </body>
</html>

nginx.conf添加下面的内容:

server {
        listen 80;
        root html/search;
        server_name search.home.com;
        rewrite ^(.*) http://www.home.com/search$1 break; #将此处重写的URI作为一个新的URI,在本块中继续进行处理。
                                                       #该标志将重写后的地址在当前的location块中执行,不会将新的URI转向其他的location块
  }


 server {
        listen 80;
        root html/item;
        server_name item.home.com;
        rewrite ^(.*) http://www.home.com/item$1 break;
 }

 
 server {
        listen 80;
        root html/cart;
        server_name cart.home.com;
        rewrite ^(.*) http://www.home.com/cart$1 break;
 }

测试
search.home.com
在这里插入图片描述
在这里插入图片描述
item.home.com
在这里插入图片描述

在这里插入图片描述
cart.home.com
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

用VBA在Word中随机打乱单词表,进行分列

一、效果展示&#xff08;以下是三次随机打乱的结果&#xff09; 二、代码 Sub 随机分单词到后面的单元格()Dim C1 As CellDim str, str1, aDim shuffledArray() As VariantSet C1 Selection.Range.Tables(1).Cell(1, 1)str C1.Range.textstr mid(str, 3, Len(str) - 4)str…

微信小程序版NetAssist局域网工具使用

微信小程序搜《TCPUDP局域网小助手》即可使用&#xff0c;电脑端&#xff0c;安卓端&#xff0c;苹果端都可以使用

【前端面试】七、算法-递归、拷贝等

目录 1.常考算法 2.遍历方法 3.链式调用 4.递归 5.拷贝和比较 1.常考算法 排序算法&#xff1a;快速排序、归并排序、堆排序等。 查找算法&#xff1a;二分查找、哈希表查找等。 动态规划&#xff1a;解决最优化问题&#xff0c;如斐波那契数列、最长公共子序列等。 图…

8.3 day bug

bug1 文件名字写错了&#xff0c;找了半天bug原因 freecodecamp的致敬页的测试验证不通过bug 已经写了display: block;和max-width: 100% 以及通过margin: 0 auto;居中&#xff0c;可是却通不过验证 问了通义千问 通义帮我修改后的html代码为 <!DOCTYPE html> 2<h…

打扫朋友圈

我把上周写的一篇文章&#xff0c;发到了老家的一个群里&#xff0c;结果有个多年没联系的亲戚&#xff0c;立马私信给我说&#xff0c;让我不要在群里发&#xff0c;说我写的东西不行&#xff0c;他自己看了两行就看不下去了&#xff0c;然后给我讲了一堆大道理。 哎呦我去&a…

从零开始的CPP(34)——字符串乘法

给定两个以字符串形式表示的非负整数 num1 和 num2&#xff0c;返回 num1 和 num2 的乘积&#xff0c;它们的乘积也表示为字符串形式。 注意&#xff1a;不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 示例 1: 输入: num1 "2", num2 "3" …

RAG 的优化进阶与引入 Reranker

引言 在简单的 RAG 系统中&#xff0c;通过结合检索和生成技术&#xff0c;已经可以显著提升了对复杂查询的响应质量。Reranker 作为 RAG 系统中一个关键的进阶组件&#xff0c;通过对原 RAG 中检索到的内容进行重新组织&#xff0c;可以进一步提高系统的准确性。 本文将深入…

vmware虚拟机linux服务器的IP需要重启才能生效问题

vmware虚拟机linux服务器的IP需要重启才能生效问题 问题说明处理办法关闭&禁用网络管理 再次重启linux服务器&#xff0c;IP显示正常 问题说明 用vmware虚拟的linux服务器&#xff0c;配置了静态IP&#xff0c;但是每次重启liunx&#xff0c;IP都不是设置的静态IP&#xf…

国外教育人工智能发展与应用

在全球化与信息化交织的时代背景下&#xff0c;人工智能正迅速推动教育发生颠覆性变革。从大洋彼岸到东方之滨&#xff0c;世界主要国家和组织正采取相关行动和策略&#xff0c;深度挖掘和释放教育AI的潜能。本文从政策支持、教育应用两个方面&#xff0c;聚焦“教育人工智能”…

centos 安装nacos

nacos官网下载安装包&#xff08;安装nacos之前&#xff0c;先下载安装好jdk&#xff09; 概览 | Nacos 官网 2.下载好nacos压缩包之后&#xff0c;上传到linux目录中&#xff08;在/opt/目录下建好一个文件夹&#xff09; 将nacos解压 uzip nacos-server-1.4.7.zip 进入naco…

【STM32系统】基于STM32设计的按键PWM控制舵机窗帘柜子门禁家居等控制系统——文末资料下载

演示 摘要 随着智能家居技术的不断发展&#xff0c;舵机在自动化家居设备中的应用变得越来越广泛。本文设计并实现了一种基于STM32单片机的按键PWM控制舵机系统。通过按键可以精确控制舵机角度&#xff0c;实现对窗帘、柜子、门禁等家居设备的智能化控制。系统采用STM32F10x系…

C# Unity 面向对象补全计划 七大原则 之 单一职责

本文仅作学习笔记与交流&#xff0c;不作任何商业用途&#xff0c;作者能力有限&#xff0c;如有不足还请斧正 本系列作为七大原则和设计模式的进阶知识&#xff0c;看不懂没关系 1.单一职责原则&#xff08;SRP&#xff09; 单一职责原则&#xff08;Single Responsibility P…

iPhone怎么大批量删除照片:释放你的存储空间

随着iPhone相机质量的提升&#xff0c;我们越来越倾向于使用手机捕捉生活中的每一个瞬间。不久后&#xff0c;我们就会发现手机内存充满了成千上万的照片&#xff0c;这不仅占用了大量的存储空间&#xff0c;也让照片的管理变得越来越困难。对于需要释放空间的用户来说&#xf…

谷粒商城实战笔记-125-全文检索-ElasticSearch-整合-SpringBoot整合high-level-client

文章目录 一&#xff0c;技术选型1. 通过 TCP 连接&#xff08;9300 端口&#xff09;2. 通过 HTTP 连接&#xff08;9200 端口&#xff09;3.最终选择 二&#xff0c;SpringBoot整合Elasticsearch-Rest-High-Level-Client1&#xff0c;新增模块gulimall-search1&#xff0c;添…

基于python旅游推荐系统(源码+论文+部署讲解等)

博主介绍&#xff1a;✌全网粉丝10W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术栈介绍&#xff1a;我是程序员阿龙&#xff…

【Hadoop-驯化】一文学会hadoop访问hdfs中常用命令使用技巧

【Hadoop-驯化】一文学会hadoop访问hdfs中常用命令使用技巧 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内容文档关注&am…

MockingBird - 实时语音克隆 中文/普通话

文章目录 一、关于 MockingBird特性 二、安装1、通用配置2、M1芯片Mac环境配置&#xff08;Inference Time)2.1 安装PyQt52.2 安装pyworld和ctc-segmentation2.3 安装其他依赖2.4 运行 三、准备预训练模型1、使用数据集自己训练encoder模型 (可选)2、使用数据集自己训练合成器模…

41缺失的第一个正数【力扣】【C++】

题目描述 题目链接 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,0] 输出&#xff1a;3 解释&#xff1a;范围 [1,…

一篇文章让你搞懂原码,反码,补码!

目录 1.机器数和机器数真值 1.1机器数 1.2机器数的真值 2.原码&#xff0c;反码&#xff0c;补码的计算方法 2.1原码 2.2反码 2.3补码 3.为什么要使用反码和补码&#xff1f; 3.1原码不能让符号位参与运算的问题&#xff1a; 3.2为了解决原码作减法&#xff0c;引入…

【C语言】算法:二分查找

当我们想在一个有序的序列里面查找一个数字的时候&#xff0c;通常会想到使用循环遍历&#xff0c;也就是下面这种方法&#xff1a; 比如我们想在下面的数组里面找到7&#xff1a; int main() {int num 7;int arr[10] { 1,2,3,4,5,6,7,8,9,10 };for (int i 0; i < size…