8090要玩网 手游攻略 新游动态 它是唯一了解Nginx/OpenRisty的详细说明的人,Nginx的重写模块指令?

它是唯一了解Nginx/OpenRisty的详细说明的人,Nginx的重写模块指令?

时间:2025 07 18 15:45:31 来源:互联网 浏览:0

其实它是唯一了解Nginx/OpenRisty的详细说明的人,Nginx的重写模块指令?的问题并不复杂,但是又很多的朋友都不太了解,因此呢,今天小编就来为大家分享它是唯一了解Nginx/OpenRisty的详细说明的人,Nginx的重写模块指令?的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

重写模块的说明是一种微型编程语言,包括设置,重写,休息,如果返回和其他说明。

set指令

SET指令由NGX_HTTP_REWRITE_MODULE标准模块提供,并用于将值存储到变量中。在NGINX配置文件中,变量只能存储一种类型的值,因为只有一种类型的值,即字符串。

集合指令的配置项目格式如下:

设置$变量值;注意:在NGINX配置文件中,可变定义和使用必须以$开头。 NGINX变量名称在其前面具有$符号,这是符号的要求。引用时,所有NGINX变量都必须前缀。另外,Nginx变量不能与Nginx服务器的全局变量预设具有相同的名称。例如,我们的nginx.conf文件具有以下行配置:

集$ a“ Hello World”;在上述语句中,SET配置指令分配了变量$ A,并将字符串Hello World分配给它。您还可以将变量直接嵌入到字符串常数中,以构造一个新的字符串:

set $ a'foo'; set $ b'$ a,$ a';此示例通过上述变量$ a的值构建了变量$ b的值。因此,在按顺序执行这两个说明后,$ a的值是'foo',$ b的值是'foo,foo'。将变量嵌入到字符串常数中以构造新字符串,这是一种在Linux Shell脚本中常用的技术,称为“可变插值”。

集合指令不仅具有分配值的功能,而且还具有创建nginx变量的副作用,即当变量为分配对象尚不存在时,它将自动创建变量。例如,在上面的示例中,如果尚未创建变量$ a,则设置指令将自动创建用户变量$ a。

一旦创建了NGINX变量,其变量名称的可见范围就是整个NGINX配置,甚至可以跨越不同虚拟主机的服务器配置块。但是,对于每个请求,所有变量均具有独立的副本,或者有每个变量的独立副本,每个变量都用每个变量用于存储值,它们不会彼此干扰。 NGINX变量的寿命不可能越过请求边界。

rewrite指令

重写指令由NGX_HTTP_REWRITE_MODULE标准模块提供,其主要功能是重写请求URI。重写指令的格式如下:

重写regrex替换[flag];如果Regrex与URI匹配,则将替换为替换的计算结果。替换通常是“可变插值”表达式,其计算后的字符串是新的URI。

下面的示例具有两个重新配置项目,如下:

位置/download/{重写^/download/(.***)/video/(.* $/view/view/qulquiew/qulquen last;重写^/download/(.for/(返回404;}位置/查看{echo'URI: $ uri';}请求http://CrazyDemo.com/download/1/video/10在浏览器中。地址已重写,位置跳跃发生。结果如图7-17所示。

图7-17输出结果

在此示例中,占位符变量的值$ 1和$ 2的替换值与原始URI的regrex正则表达式相匹配,也称为常规捕获组,数字从1开始。

重写指令可以使用的上下文是:服务器,位置,如果置换。

如果在重写的相同上下文中存在多个此类重写,则匹配将根据重写指令出现的顺序进行顺序进行。比赛成功后,它将不会终止,但是将继续匹配,直到最后一场比赛返回。如果您想中途中止该过程并且不再继续匹配,则可以使用第三个指令参数标志。标志参数的值是最后一个,断裂,重定向和永久性的。

如果FLAG参数使用最后一个值并且匹配成功,请停止处理任何与重写相关的指令,并立即开始下一轮位置匹配,并使用计算出的新URI跳跃。上一个示例使用最后一个参数值。

如果标志参数使用断点值,它将停止处理任何与重写相关的指令,但不会执行位置跳跃。

在上面的重写示例中将最后一个参数值更改为中断,代码如下:

位置/查看{echo'View : $ uri'; } location/download_break/{rewrite ^/download_break/(.** :)/video/(重写^/download_break/(.for/( echo'download_break new URI : $ URI';}请求http://CrazyDemo.com/download_break/1/video/10在浏览器中。地址已重写,但位置没有跳跃,而是直接结束了。结果如图7-18所示。

图7-18显示结果

在位置上下文中,最后和断裂是不同的:最后一个实际上等同于新URL。 Nginx执行新的位置匹配,并获得了将其转移到其他位置配置(内部重定向)的机会;并在某个位置将原始URL(包括URI和ARGS)重写,然后继续执行后续处理。重写后的请求始终处于相同的位置上下文中,并且不会发生内部重定向。

请注意:最后和断裂之间的区别仅发生在位置上下文中;如果它发生在服务器上下文中,那么最后一个和断裂的功能是相同的。

另请注意:使用位置上下文中的最后指令参数,位置上下文中的重写指令将重新定位内部重定向,并再次匹配位置。新的URI最有可能与旧URI相同的目标位置匹配,因此将发生死循环。当循环达到第10次时,NGINX将终止这种毫无意义的循环并返回500误差。这需要特别注意。

如果重写指令使用的标志参数的值是永久性的,则表示外部重定向,即对客户端的重定向。此时,服务器将新的URI地址返回客户端浏览器,并将301(永久重定向响应代码)返回到客户端。客户将使用新的重定向地址启动另一个远程请求。

使用永久重定向永久性的示例如下:

#Rewrite指令永久参数演示位置/download_permanent/{重写^/download_permanent/(.fer/(重写^/download_permanent/(.fer/(返回404;}请求http://CrazyDemo.com/download_permanent/1/video/10在浏览器中,输出结果如图7-19所示。

图7-19输出结果

从上述结果中,我们可以看到永久重定向具有两个相对较大的特征:

(1)浏览器的地址栏成为重定向地址

http://Crazydemo.com/view/1/mp3/10.mp3。 (2)从提琴手数据包捕获工具中,您可以看到第一个请求地址的响应状态代码为301,如图7-20所示。

图7-20永久重定向响应代码的示意图

外部重定向和内部重定向之间存在根本差异。在数量方面,外部重定向有两个请求,并且内部重定向只有一个请求。通过上述示例,您应该有深刻的理解。

如果重写指令使用的标志参数的值是重定向,则表示执行外部重定向,并且行为与永久参数的值完全相同。不同之处在于,将302(临时重定向的响应代码)返回给客户端。

它是唯一了解Nginx/OpenRisty的详细说明的人,Nginx的重写模块指令?

重写可以使用常规捕获组设置变量。作为实验,我们可以将这样的位置规则添加到NGINX配置文件中:

location/capture_demo {重写^/capture_demo /(.***)/video/(重写^/capture_demo /(.* :)/audio/(.******mudy/view/quh $ 1/mp3/qul $ 2.rmvb break;捕获组捕获组回声'捕获组1: $ 1;捕获组2: $ 2';}请求http://CrazyDemo.com/capture_demo/group1/group1/video/group2在浏览器中,输出结果如图7-21所示。

图7-21输出结果

如果条件指令配置项目如下:

if条件指令

的格式如下:

如果(条件){.}满足IF条件时,请在配置块中执行配置指令。 IF的配置块等效于引入新的上下文范围。 IF条件指令适用于服务器和位置上下文。

条件表达式可以使用一系列比较操作员,大致如下:

(1)==:相等。

(2)!=:不相等。

(3):字母顺序的案例敏感模式匹配。

(4)*:对字母案例模式匹配不敏感。

(5)还有其他几个特殊比较符号,例如确定文件和目录是否存在的符号,等等。

以下是一个简单的演示程序,该程序根据内置变量$ http_user_agent的值来确定客户端的类型。代码如下:

如果指令演示程序位置/if_demo {if($ http_user_agent*'firefox'){#match firefox浏览器返回403; }匹配Google Chrome

if($ http_user_agent*'chrome'){#Match Chrome Google Chrome return 301; } if($ http_user_agent*'iPhone'){#Match iPhone返回302; } if($ http_user_agent*'android'){#match android电话返回404; }返回405; #default访问其他浏览器}}访问Firefox浏览器中的http://CrazyDemo.com/if_demo,结果如图7-22所示。

图7-22 Firefox浏览器访问结果

访问http://Crazydemo.com/if_demo在Google Chrome中,结果如图7-23所示。

图7-23 Google Chrome访问结果

返回指令在演示码中使用以返回HTTP的状态代码。

返回指令将停止在同一范围中处理其余指令,并将指定的响应代码返回给客户端。

返回指令可以在服务器,位置和上下文中使用,并且执行阶段是重写阶段。其说明的格式如下:

#format 1:返回响应的状态代码和提示文本。可以选择提示文本以进行返回代码[文本];格式2:返回响应的重定向状态代码(例如301)和重定向URL返回代码url; #format 3:返回响应的重定向URL。默认返回状态代码是临时重定向302返回URL;

add_header指令

响应标头通常以关键的形式:值:诸如内容编码:

Gzip,Cache-Control:无存储,命令集如下:

add_header缓存-Control no-storeadd_header content-ensegoning gzip但是,有一个非常常用的响应标头是content-type。您可以在设置类型时指定charset,例如text/html; charset=UTF-8。因为它具有半圆柱,并且半隆在配置文件中用作结尾字符,因此在配置时,需要用引号包装。配置如下:

add_header content-type'text/html; charset=utf-8';此外,由于没有单独设置Charset密钥,要设置响应charset,则需要使用Content-Type来指定CHARSET。

当使用AJAX提出跨域请求时,浏览器将向跨域资源的服务器发送选项请求,该请求用于确定实际请求是否安全,或者服务器是否允许跨域访问。这种请求也称为飞行前请求。跨域访问的飞行前请求将由浏览器自动发布,并且用户程序通常不知道它。如果客户端没有进行特殊配置,则客户端通常会在服务器端收到两个请求。一个是飞行前请求;另一个是正式请求。如果后端服务器(PHP或TOMCAT)不进行特殊过滤,则很容易将选项视为前请求视为正式数据请求。

指令的执行顺序

大多数NGINX新手经常会遇到混乱:当相同的位置配置块使用多个Nginx模块配置指令时,这些说明的执行顺序可能与其写作顺序大不相同。让我们现在看看这个令人困惑的例子:

位置/sequence_demo_1 {set $ a foo;回声$ a;设置$ a bar; echo $ a;}上面的代码首先将foo分配给变量$ a,然后输出,然后将bar分配给变量$ a,然后输出。如果这是Java代码,则毫无疑问,最终输出必须是“ foo bar”。不幸的是,事实并非如此。访问浏览器中的http://CrazyDemo.com/sequence_demo_1,结果如图7-24所示。

图7-24输出结果

为什么会发生这种不合理的现象?

如前所述,NGINX中有11个请求处理阶段,即读取后,服务器- 螺丝,find-config,重写,后螺纹,预先提前,访问,访问,后访问,访问,try文件,内容,内容和日志。另外三个常见的是执行顺序的重写阶段,访问阶段和内容阶段。

NGINX配置指令通常仅在某个处理阶段注册并运行。例如,设置指令是在重写阶段运行的,而回声说明仅在内容阶段运行。在请求处理流中,重写阶段始终在内容阶段之前执行。因此,即使在集合配置项目之前出现ECHO配置项目,属于重写阶段的配置指令(示例中设置)也将始终无条件地执行(示例中的Echo)。

上面示例中的说明按请求处理阶段的顺序排序,实际执行订单如下:

用户评论

浮光浅夏ζ

哈哈,我也是这样觉得!虽然这篇文章讲的很详细,但我感觉还有一些其他的工具和技巧可以用来优化配置,比如Lua脚本等等,或许可以后面分享一下经验。

    有20位网友表示赞同!

心贝

终于有文章提到Rewrite了!这个模块确实很有用,尤其是在处理URL重定向和静态资源请求的时候。感觉OpenResty的结合更强大!

    有12位网友表示赞同!

念初

标题有点夸张吧,“只有我懂”是不是言过其实了一点?Nginx/OpenResty这些东西可太常见了,很多工程师都用它来开发项目啊!

    有6位网友表示赞同!

北朽暖栀

这篇文章讲得真细致!我终于明白了Rewrite模块的用法了,以前一直不知道怎么配置好重定向规则,现在看来还挺简单。不过我还是感觉有很多种思路可以实现同一个效果,需要多多练*和积累经验。

    有12位网友表示赞同!

微信名字

说实话,我觉得文章写的有点难理解,Nginx配置文件太复杂了,好多地方都搞不懂... 还是希望能有更多通俗易懂的教程.

    有13位网友表示赞同!

反正是我

确实很佩服作者对Rewrite模块的了解!我之前学过,但是很多用法还没实践出来,这篇博文把我又唤醒了学*欲望。

    有11位网友表示赞同!

凝残月

我也是个Nginx/OpenResty爱好者,平时经常会用到Rewrite模块,但发现很多写法都有优劣比较... 期待后续文章分享更实战的经验!

    有11位网友表示赞同!

冷风谷离殇

这篇文章帮我解决了长期困扰的问题!感谢作者分享! Nginx 配置一直让我头疼,现在终于明白REWRITE模块的奥妙之处了。

    有18位网友表示赞同!

独角戏°

Nginx/OpenResty确实是好工具,但配置起来的确有些复杂啊! 很多高级用法还得自己去实践摸索。

    有19位网友表示赞同!

屌国女农

感觉文章里的解释还是比较浅层的,对于深入了解Rewrite模块原理,还需要阅读更系统的书籍或者教程。

    有16位网友表示赞同!

∞◆暯小萱◆

Agree! Rewrite模块真是神器!我常用它来实现URL短链和页面重定向,效率非常高。这篇文章讲的的确到位,帮了我不少忙。

    有16位网友表示赞同!

娇眉恨

虽然文章标题有点夸张,但确实分享了一些我很实用的知识点,比如Nginx内部机制和一些性能优化技巧。

    有17位网友表示赞同!

迷路的男人

个人觉得这篇博文比较浅显,对于已经熟悉OpenResty的用户来说没有太多新意。 希望作者后期能分享更深入的内容。

    有14位网友表示赞同!

执念,爱

这篇文章让我眼前一亮!原来Nginx/OpenResty还有这么多功能和技巧可以利用! 我一定得好好学*一下!

    有13位网友表示赞同!

我绝版了i

感觉这个Rewrite模块的用法还是比较灵活的,可以实现很多个性化的需求。 以后试试用它来优化我自己的项目配置。

    有17位网友表示赞同!

神经兮兮°

我是Web开发新手,对Nginx/OpenResty不太了解。看了这篇文章后发现它的应用确实很广泛,我会好好学*一下相关知识!

    有16位网友表示赞同!

柠夏初开

我也很喜欢使用Rewrite模块,它帮助我简化了很多复杂的操作! 希望能看到更多分享关于更高级运用场景的文章。

    有14位网友表示赞同!

标题:它是唯一了解Nginx/OpenRisty的详细说明的人,Nginx的重写模块指令?
链接:https://www.yaowan8090.com/news/xydt/47973.html
版权:文章转载自网络,如有侵权,请联系删除!
资讯推荐
更多
阴阳师4月22日更新内容:帝释天上线技能调整,红莲华冕活动来袭

阴阳师4月22日更新内容:帝释天上线技能调整,红莲华冕活动来袭[多图],阴阳师4月22日更新的内容有哪些?版本更新

2025-07-13
四川电视台经济频道如何培养孩子的学习习惯与方法直播在哪看?直播视频回放地址

四川电视台经济频道如何培养孩子的学习习惯与方法直播在哪看?直播视频回放地址[多图],2021四川电视台经济频

2025-07-13
湖北电视台生活频道如何培养孩子的学习兴趣直播回放在哪看?直播视频回放地址入口

湖北电视台生活频道如何培养孩子的学习兴趣直播回放在哪看?直播视频回放地址入口[多图],湖北电视台生活频道

2025-07-13
小森生活金币不够用怎么办?金币没了不够用解决方法

小森生活金币不够用怎么办?金币没了不够用解决方法[多图],小森生活金币突然就不够用的情况很多人都有,金币没

2025-07-13