总结:nginx配置

2023-09-22 11:08:47

一、nginx rewrite 与 proxy_pass区别

rewriteproxy_pass 都是 Nginx 的常用指令,但它们的功能和使用场景有所不同。

1、rewrite:是一个用来修改请求 URI 的指令。在 Nginx 收到一个请求后,rewrite 指令可以基于特定的条件改变这个请求的 URI,可能是改变文件路径,可能是重定向到一个新的地址。基本的语法为 rewrite regex replacement [flag] 其中 regex 是要匹配的正则表达式,replacement 是匹配的结果要被替换的内容。例如,rewrite ^(/download/.*)/media/(.*)$ $1/mp3/$2,这个会把 "/download/media/abc.mp3"这样的 URL 替换为 "/download/mp3/abc.mp3"。负载越大,对硬件的要求就越高。

2、proxy_pass:这个指令告诉 Nginx 将收到的请求转发到其他的服务器。在做反向代理时经常会用到此命令。例如,proxy_pass http://localhost:8000; 这个配置就会把所有请求转发到运行在 localhost:8000 上的服务器。负载越高,对网络的需求就越大。

而它们之间的主要区别就是,rewrite 是对请求 URL 的修改,而不改变请求的目的地,而 proxy_pass 是不改变 URL,但是改变了请求的后端服务器,这两个指令通常结合起来使用,用以实现一些特定的需求。在实际运用中我们经常看到这两者一起使用,以满足定制化路由的逻辑。

例如:

location / {
    rewrite ^/abc/(.*)$ /xyz/$1 break;
    proxy_pass http://localhost:8000;
}

这个配置中,客户端请求的 URL "/abc/test" 会被重写为 "/xyz/test" ,然后再被转发到 localhost:8000 这个服务器上。

问题一:问题来了,那么,使用rewrite后,假设我的配置是location / { rewrite ^/abc/(.*)$ /xyz/$1 break; proxy_pass http://localhost:8000; },那么我在浏览器输入http://10.10.1.2/abc/mm,访问后,浏览器地址是否会变成http://10.10.1.2/xyz/mm?

不会,Nginx的rewrite指令在这种情况下只会更改传递给后端服务器的URI,并不会影响浏览器的地址栏。在浏览器地址栏输入http://10.10.1.2/abc/mm,服务器会接收到这个请求并通过rewrite规则将其更改为/xyz/mm,然后将其转发到proxy_pass设置的地址http://localhost:8000/xyz/mm。但这并不会更改浏览器的地址栏。

如果你想要在rewrite后更改浏览器的地址栏,你需要发送一次HTTP重定向。例如,以下配置可以在rewrite时发送HTTP 301永久重定向:

rewrite ^/abc/(.*)$ /xyz/$1 permanent;

在此情况下,当浏览器尝试访问http://10.10.1.2/abc/mm,服务器会返回HTTP 301响应和新地址http://10.10.1.2/xyz/mm。然后浏览器会在地址栏更新新地址并请求新地址。请注意,这将使浏览器显示新URL,但也将导致两次请求——一次是原始请求,另一次是重定向到新URL的请求。

问题二:那么,使用rewrite后,假设我的配置是location / { rewrite ^/abc/(.*)$ /xyz/$1 break; },那么我在浏览器输入http://10.10.1.2/abc/mm,访问后,浏览器地址是否会变成http://10.10.1.2/xyz/mm?

不会,同样的,即使你没有使用 proxy_pass,Nginx 的 rewrite 指令也只是在服务器内部重写 URL,而不会影响浏览器地址栏显示的 URL。

在你的例子中,当你在浏览器输入 http://10.10.1.2/abc/mm,Nginx 会接收到这个请求,并将请求 URL 通过 rewrite 规则改写为 "/xyz/mm"。然后,Nginx 会在本地查找这个新的 URL 对应的资源。这个过程对客户端浏览器是不可见的,因此浏览器地址栏还是会显示原来输入的 URL。

如果你要想改变浏览器的地址栏显示的 URL,你需要显式地发出一个重定向响应,比如使用 HTTP 的 301 或 302 状态码。这可以通过在 rewrite 指令后面添加 redirectpermanent 标志来实现。例如,

rewrite ^/abc/(.*)$ /xyz/$1 permanent;

这样,当一个请求匹配这个 rewrite 规则时,Nginix 会向客户端浏览器发出一个 301(永久重定向)响应,浏览器接收到这个响应之后,会自动将地址变为新的 URL 并重新发送请求。

问题三:rewrite ^/abc/(.*)$ /xyz/$1 permanent;和rewrite ^/abc/(.*)$ /xyz/$1 redirect;是什么区别

rewrite ^/abc/(.*)$ /xyz/$1 permanent;rewrite ^/abc/(.*)$ /xyz/$1 redirect; 这两个Nginx配置的主要区别在于重定向的HTTP状态码。

  • permanent: 生成一个HTTP 301 Moved Permanently响应。这个响应是永久性的,告诉客户端(比如浏览器)这个资源已经被永久的移动到了新的位置,以后应该直接去新的位置查找这个资源。

  • redirect:生成一个HTTP 302 Moved Temporarily响应。这个响应告诉客户端这个资源被暂时移动到了新的位置,但是可能以后还会回到原来的位置。

因此,在实际使用中,你应该根据实际情况选择恰当的响应。如果你知道资源永久的移动到了新的位置,那么应该使用permanent;如果你知道资源只是暂时移动到新的位置,那么应该使用redirect。

 

更多推荐

数据分析及治理工程师

背景企业的信息化建设需要数据,那么数据是很重要的,数据分析的目的在于为业务服务,而为了更好的达成这一目的。对于元数据的采集和主数据的分析,以及数据标准的制定,和数据质量的保证是非常重要的。主数据管理面临的问题分析主数据治理可以提高数据的特征一致性,识别唯一性,高度共享性,长期有效性,可以获得一个单一的基础数据来源,为企

互联网摸鱼日报(2023-09-22)

互联网摸鱼日报(2023-09-22)36氪新闻通过AI打造车联网地图,「Mapbox」获软银2.8亿美元E轮投资消失的维密门店,以及背后的内衣暗战白酒品牌频跨界:饮料就酒,越喝越有张一鸣北美电商大冒险拆解小程序短剧“一天进账1200万”商业真相​奈飞继续“飞翔”A股银行回购为何“按兵不动”?监管机制约束,部分银行资本

热更新的前置模块:AB管理器

引言本系列是《8年主程手把手打造Cocos独立游戏开发框架》,欢迎大家关注分享收藏订阅。前面的文章给大家介绍了手敲Cocos独立游戏开发框架中常用到的UI管理器和资源管理器,为了减少包体的大小,我们需要引入热更新的模块,但是热更新的前提是把资源打成AssetBundle(简称AB),本文笔者给大家介绍一下AB和AB管理

【MySQL】SQL优化

SQL优化插入数据普通插入:采用批量插入(一次插入的数据不建议超过1000条,500-1000为宜)手动提交事务主键顺序插入(主键顺序插入的效率大于乱序插入)大批量插入:如果一次性需要插入大批量数据,使用insert语句插入性能较低,此时可以使用MySQL数据库提供的load指令插入。#客户端连接服务端时,加上参数--

【Leetcode Sheet】Weekly Practice 7

LeetcodeTest1462课程表Ⅳ(9.12)你总共需要上numCourses门课,课程编号依次为0到numCourses-1。你会得到一个数组prerequisite,其中prerequisites[i]=[ai,bi]表示如果你想选bi课程,你必须先选ai课程。有的课会有直接的先修课程,比如如果想上课程1,你

Zookeeper集群 + Kafka集群

Zookeeper集群+Kafka集群Zookeeper概述Zookeeper定义*Zookeeper是一个开源的分布式的,为分布式框架提供协调服务的Apache项目。Zookeeper工作机制*****Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数

PY32F003F18之ADC问题

普然单片机PY32F003F18的内部有一个LDO,其电压固定为1.2V。我在用官方程序测试时,若接上USB转串口的RX导线,向PC发送数据,读内部参考电压比较正确,但是,当接上USB转串口的TX导线时,发现读到内部电压变成了3.3V。见下图:断开USB转串口的TX导线,数据又恢复正常了。用万用表测试该导线电压,为5V

最新中国各地区新能源汽车产量及123个公司公共充电桩数量数据(2015-2023)

数据简介:2010年,《国务院关于加快培育和发展战略性新兴产业的决定》将新能源汽车产业列为战略性新兴产业之一。9月5日,在工信部召开的重点行业稳增长新闻发布会上,工信部装备工业一司司长王卫明表示,今年1—7月,我国新能源汽车产销超过450万辆,同比增长超过40%,其中出口63.6万辆,同比增长1.5倍,成为我国经济的一

go并发(进程、线程、协程)

背景go强大的多线程能力很强大,能并发处理大量的任务。详细案例分类主要介绍go中的进程、线程、协程这三个东西。它们的关系按照内存大小的关系依次是进程>线程>协程(一般一个协程2K)。进程进程基本上是一个正在执行的程序,它是操作系统中最小的资源分配单位。比如电脑上运行的一个软件就是一个进程。go开启进程的方式有三种,本质

MySQL(2) Explain

1、概念使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈2、使用在select语句之前增加explain关键字,MySQL会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL在explain语句后马上执行一条showwarnings语句,会展示mysql对上

Docker

前言:📕作者简介:热爱编程的小七,致力于C、Java、Python等多编程语言,热爱编程和长板的运动少年!📘相关专栏Java基础语法,JavaEE初阶,数据库,数据结构和算法系列等,大家有兴趣的可以看一看。😇😇😇有兴趣的话关注博主一起学习,一起进步吧!一、初识Docker1.1项目部署的问题大型项目组件较多,

热文推荐