yii2通过url访问类中的方法_每日学点---nginx变量使用方法详解(3)

b4f62b268b16a6881e898d2d7ee7e79f.png

也有一些内建变量是支持改写的,其中一个例子是 $args. 这个变量在读取时返回当前请求的 URL 参数串(即请求 URL 中问号后面的部分,如果有的话 ),而在赋值时可以直接修改参数串。我们来看一个例子:

 location /test { set $orig_args $args; set $args "a=3&b=4"; echo "original args: $orig_args"; echo "args: $args"; }

这里我们把原始的 URL 参数串先保存在 $orig_args 变量中,然后通过改写 $args 变量来修改当前的 URL 参数串,最后我们用 echo 指令分别输出 $orig_args 和 $args 变量的值。接下来我们这样来测试这个 /test 接口:

 $ curl 'http://localhost:8080/test' original args: args: a=3&b=4  $ curl 'http://localhost:8080/test?a=0&b=1&c=2' original args: a=0&b=1&c=2 args: a=3&b=4

在第一次测试中,我们没有设置任何 URL 参数串,所以输出 $orig_args 变量的值时便得到空。而在第一次和第二次测试中,无论我们是否提供 URL 参数串,参数串都会在 location /test 中被强行改写成 a=3&b=4.

需要特别指出的是,这里的 $args 变量和 $arg_XXX 一样,也不再使用属于自己的存放值的容器。当我们读取 $args 时,Nginx 会执行一小段代码,从 Nginx 核心中专门存放当前 URL 参数串的位置去读取数据;而当我们改写 $args 时,Nginx 会执行另一小段代码,对相同位置进行改写。Nginx 的其他部分在需要当前 URL 参数串的时候,都会从那个位置去读数据,所以我们对 $args 的修改会影响到所有部分的功能。我们来看一个例子:

 location /test { set $orig_a $arg_a; set $args "a=5"; echo "original a: $orig_a"; echo "a: $arg_a"; }

这里我们先把内建变量 $arg_a 的值,即原始请求的 URL 参数 a 的值,保存在用户变量 $orig_a 中,然后通过对内建变量 $args 进行赋值,把当前请求的参数串改写为 a=5 ,最后再用 echo 指令分别输出 $orig_a 和 $arg_a 变量的值。因为对内建变量 $args 的修改会直接导致当前请求的 URL 参数串发生变化,因此内建变量 $arg_XXX 自然也会随之变化。测试的结果证实了这一点:

 $ curl 'http://localhost:8080/test?a=3' original a: 3 a: 5

我们看到,因为原始请求的 URL 参数串是 a=3, 所以 $arg_a 最初的值为 3, 但随后通过改写 $args 变量,将 URL 参数串又强行修改为 a=5, 所以最终 $arg_a 的值又自动变为了 5.

我们再来看一个通过修改 $args 变量影响标准的 HTTP 代理模块 ngx_proxy 的例子:

 server { listen 8080;  location /test { set $args "foo=1&bar=2"; proxy_pass http://127.0.0.1:8081/args; } }  server {  listen 8081; location /args { echo "args: $args"; } }

这里我们在 http 配置块中定义了两个虚拟主机。第一个虚拟主机监听 8080 端口,其 /test 接口自己通过改写 $args 变量,将当前请求的 URL 参数串无条件地修改为 foo=1&bar=2. 然后 /test 接口再通过 ngx_proxy 模块的 proxy_pass 指令配置了一个反向代理,指向本机的 8081 端口上的 HTTP 服务 /args. 默认情况下,ngx_proxy 模块在转发 HTTP 请求到远方 HTTP 服务的时候,会自动把当前请求的 URL 参数串也转发到远方。

而本机的 8081 端口上的 HTTP 服务正是由我们定义的第二个虚拟主机来提供的。我们在第二个虚拟主机的 location /args 中利用 echo 指令输出当前请求的 URL 参数串,以检查 /test 接口通过 ngx_proxy 模块实际转发过来的 URL 请求参数串。

我们来实际访问一下第一个虚拟主机的 /test 接口:

 $ curl 'http://localhost:8080/test?blah=7' args: foo=1&bar=2

我们看到,虽然请求自己提供了 URL 参数串 blah=7,但在 location /test 中,参数串被强行改写成了 foo=1&bar=2. 接着经由 proxy_pass 指令将我们被改写掉的参数串转发给了第二个虚拟主机上配置的 /args 接口,然后再把 /args 接口的 URL 参数串输出。事实证明,我们对 $args 变量的赋值操作,也成功影响到了 ngx_proxy 模块的行为。

在读取变量时执行的这段特殊代码,在 Nginx 中被称为“取处理程序”(get handler);而改写变量时执行的这段特殊代码,则被称为“存处理程序”(set handler)。不同的 Nginx 模块一般会为它们的变量准备不同的“存取处理程序”,从而让这些变量的行为充满魔法。

其实这种技巧在计算世界并不鲜见。比如在面向对象编程中,类的设计者一般不会把类的成员变量直接暴露给类的用户,而是另行提供两个方法(method),分别用于该成员变量的读操作和写操作,这两个方法常常被称为“存取器”(accessor)。下面是 C++ 语言中的一个例子:

 #include  using namespace std; class Person { public: const string get_name() { return m_name; }  void set_name(const string name) { m_name = name; }  private: string m_name; };

在这个名叫 Person 的 C++ 类中,我们提供了 get_name 和 set_name 这两个公共方法,以作为私有成员变量 m_name 的“存取器”。

这样设计的好处是显而易见的。类的设计者可以在“存取器”中执行任意代码,以实现所需的业务逻辑以及“副作用”,比如自动更新与当前成员变量存在依赖关系的其他成员变量,抑或是直接修改某个与当前对象相关联的数据库表中的对应字段。而对于后一种情况,也许“存取器”所对应的成员变量压根就不存在,或者即使存在,也顶多扮演着数据缓存的角色,以缓解被代理数据库的访问压力。

与面向对象编程中的“存取器”概念相对应,Nginx 变量也是支持绑定“存取处理程序”的。Nginx 模块在创建变量时,可以选择是否为变量分配存放值的容器,以及是否自己提供与读写操作相对应的“存取处理程序”。

不是所有的 Nginx 变量都拥有存放值的容器。拥有值容器的变量在 Nginx 核心中被称为“被索引的”(indexed);反之,则被称为“未索引的”(non-indexed)。

我们前面在 (二) 中已经知道,像 $arg_XXX 这样具有无数变种的变量群,是“未索引的”。当读取这样的变量时,其实是它的“取处理程序”在起作用,即实时扫描当前请求的 URL 参数串,提取出变量名所指定的 URL 参数的值。很多新手都会对 $arg_XXX 的实现方式产生误解,以为 Nginx 会事先解析好当前请求的所有 URL 参数,并且把相关的 $arg_XXX 变量的值都事先设置好。然而事实并非如此,Nginx 根本不会事先就解析好 URL 参数串,而是在用户读取某个 $arg_XXX 变量时,调用其“取处理程序”,即时去扫描 URL 参数串。类似地,内建变量 $cookie_XXX 也是通过它的“取处理程序”,即时去扫描 Cookie 请求头中的相关定义的。

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

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

相关文章

GOOGLE HACKING 系列文章 【FreeXploiT整理收集】

本文涉及作者 swap(慕容小雨),zhaohuan(Xfocus),snipe(4ngel)信息安全的隐患-GoogleHacking原理和防范作者:zhaohuanphack.org 来源:www.phack.org技术天地&a…

Openldap命令详解

Openldap 客户端常用管理命令 1、ldapadd -x: 简答认证方式-W: 不需要在命令上写密码 ldapapp -x -D "cnManager,dcsuixingpay,dccom" -W-w: password 需要命令上指定密码 ldapapp -x -D "cnManager,dcsuixingpay,dccom" -w 123456-H: 通过ldapapi-h: host…

用python画六瓣雪花_python-turtle-画雪花-2种方法及效果的详解

#python3.8#xuguojun#2020.1.30#导出模块,这样导出比代码较简洁,但是注意r和后面RGB的r,所以我改为d代替R(r) importturtle as timportrandom as r#绘制雪花 s30 #定义30个 defsnow(s): t.ht()#hthideturtle&#xff0…

2018年高考游记

2018年高考游记 在前言之前: 这篇文章已经写十几天吧 有心情时偶尔写上几段 也不知道自己抱着什么心态了,是留下一点回忆,还是给看得人启迪,还是...... 反正是要写出点东西来的 凡是现实的都是合乎理性的,凡是合乎理性…

小白学python需要多久_小白学Python | 你还在说你入不了门吗

收藏的好多啊 原创不易,动动小手,点个赞啦!! 十二月份,天气有时候会很阴沉,一天都见不到太阳。气温也慢慢变冷了,晚上回家还是会感觉到衣服穿少了。 阴阴沉沉总会过去的,我还是期待阳…

欧美剧集观看最佳索引 【2006-9-24更新】

allyesno:我在上两个月说要做一个美剧的网站 由于最近公司的事情一直很繁忙 我没有时间去做自己都积累了一大堆 美剧 日剧 恐怖片 没看 两个电脑的硬盘都塞的满满的 呵呵真是 天长地久有时尽,此恨绵绵无绝期。 哈哈~ 我现在正在构思 是不是把美剧网站列入公司的发展…

python语言format用法_详解Python中的format格式化函数的使用方法

format函数实现字符串格式化的功能 基本语法为: 通过 : 和 {} 来控制字符串的操作 一、对字符串进行操作 1. 不设置指定位置,按默认顺序插入 ①当参数个数等于{}个数的时候 str_1 "小明{}小美,可是小美{}小明".format("喜欢", &quo…

如何提高英文的科研写作能力

作为一个科研工作者,在国际学术期刊上发表科研论文是与同行交流、取得国际影响的必经之路。有些国内的科学家,实验做得很漂亮,但常常苦恼于论文的写作力不从心,成为国际交流的一大障碍。本文从博主的亲身体验出发,给博…

电子书专题

EXE电子书与垃圾 作者:马健邮箱:stronghorsetom.com主页:http://stronghorse.yeah.net 目前EXE格式的电子书在网络上比较流行,制作工具五花八门,eBook Workshop和eBook Edit Pro是其中比较流行的两个。但是又有多少人知…

python变量标识符_python中的变量和标识符

字面量: 就是一个一个的值,如1、2、3、‘hello’,就是它自己本身表达的字面值、字面意思,在程序中可以直接使用。 变量(variable): 可以用来保存字面量,变量本身没有任何意思&#x…

Slimming Down Windows XP The Complete Guide 【 10章完整版 】

网上有一个汉化好的 压榨XP手册 是基于他的汉化版 现在我贴出的是英文原版你还可以向作者捐献15$以便获得一个自动优化XP的脚本原文:http://www.bold-fortune.com/forums/index.php?showforum13Thanks go out to Fred Langa for his acknowledgment of Slimming Do…

ps安装了可以打开但开始里面找不到_PS2018打开了钢笔压力但却没有压感的解决方法...

1.首先应确定是否安装数位板的驱动,如果驱动出现问题也可以试着重装一下。2.(这里以Photoshop CC 2018为例)接下来检查这个“始终对‘大小’使用‘压力’”按钮是否打开,如果是关闭的,试着打开。3.随后F5进入“画笔”选…

P3938 斐波那契

坑爹入口 我们想一下&#xff0c;第几个生的。那他的孩子就是排在新一波出生的第几个上的。 然后我们通过瞎试得到。10^12<斐波那契的第60项。就是说我们不用建图&#xff08;也建不下&#xff09;&#xff0c;每次最多60次暴力就可以了。 出题人真是个人才。 #include<c…

t检验的p值对照表_论文数据分析实战 | 如何对汇总数据进行t检验

在SPSS统计分析交流群中有学员在阅读论文的过程中看到下面的这张表格&#xff1a;这张表中记录了第16届世界男子篮球锦标赛中国队与前8名球队进攻指标比较的结果&#xff0c;其中这份表格并没有给出详细的P值&#xff0c;而只是告诉我们P值小于多少。在这种只有汇总数据&#x…

洛谷 P2389 电脑班的裁员 解题报告

题意&#xff1a; 给定一段长为N的序列&#xff0c;选取其中的至多M段使这些子段和最大。 当N1000时&#xff0c;我们可以采用动态规划解法 令\(dp[i][j][k]\)代表当前选至位置\(i\)处于第\(j\)段当前是否选取(1选0不选) 则转移为\(dp[i][j][0]max(dp[i-1][j][1],dp[i-1][j][0]…

浅谈显 ipqq 发展历程 【附显 ipqq原理】

声明&#xff0c;本文章未经过疯狂绅士与runjin的同意不得转载。浅谈IPQQ软件的技术发展轨迹疯狂绅士、RunJin摘要&#xff1a;本文先给出了IPQQ的界定&#xff0c;并介绍了不同历史时期具有里程碑意义的IPQQ。根据几个具有里程碑意义的IPQQ&#xff0c;作者简要的分析了其技术…

for命令不跳过空白行_Java程序员必备:查看日志常用的linux命令

iwenhou趁周末&#xff0c;复习一下鸟哥的linux私房菜&#xff0c;看了文件内容查阅部分&#xff0c;做个笔记&#xff0c;哈哈&#xff0c;希望对你有帮助哦。catcat : 由第一行开始显示文件所有内容参数说明cat [-AbEnTv] 参数&#xff1a; -A : 相当于-vET 的整合参数&#…

Java并发编程笔记之Semaphore信号量源码分析

JUC 中 Semaphore 的使用与原理分析&#xff0c;Semaphore 也是 Java 中的一个同步器&#xff0c;与 CountDownLatch 和 CycleBarrier 不同在于它内部的计数器是递增的&#xff0c;那么&#xff0c;Semaphore 的内部实现是怎样的呢&#xff1f; Semaphore 信号量也是Java 中一个…

三款常用IP发包工具介绍

AntPower 版权所有© 2003 技术文章http://www.antpower.org 第1 页共14 页AntPower&#xff0d;技术文章三款常用IP 发包工具介绍小蚁雄心成员郎国军著lgjqingdao.cngb.comURL修订版本版本时间修订人说明AntPower 版权所有© 2003 技术文章http://www.antpower.org 第…

python中读取指定的行和列_Python怎么获取excle中指定行和列的值?

https://www.cnblogs.com/xiazhenyu/ *** 学而思之、思而记之、记而习之 ***f"dict_file.txt" #定义文件名 def writefile(key,value): with open(f, "w") as file: # 只需要将之前的”w"改为“a"即可&#xff0c;代表追加内容&#xff0c;“w”…