<small id='sr1yl'></small> <noframes id='yMvK'>

  • <tfoot id='q9yQOTN'></tfoot>

      <legend id='ixuM3emc'><style id='WterDMy'><dir id='2HkT'><q id='Jf0nQ5DCaT'></q></dir></style></legend>
      <i id='sv3er8Q'><tr id='fDxEe'><dt id='v9Ti'><q id='zI4hueSxH'><span id='WFM5TVGr'><b id='rI23'><form id='5pTm'><ins id='PmaCcQ'></ins><ul id='5UD4'></ul><sub id='uIG2'></sub></form><legend id='B3rhu'></legend><bdo id='Ts0nq8'><pre id='eBVv'><center id='HIU4LFc'></center></pre></bdo></b><th id='1e6Z4M'></th></span></q></dt></tr></i><div id='ZN3b7'><tfoot id='5PsBjQk'></tfoot><dl id='J8vxbdN'><fieldset id='ThdAkN6nrL'></fieldset></dl></div>

          <bdo id='OHYRocCFwq'></bdo><ul id='AjMKS2B'></ul>

          1. <li id='NgiMIl'></li>
            登陆

            一号平台下载安装-每日学点---nginx变量使用方法详解(2)

            admin 2019-11-06 259人围观 ,发现0个评论

            关于 Nginx 变量的另一个常见误区是以为变量容器的生命期,是与 location 装备块绑定的。其实不然。咱们来看一个触及“内部跳转”的比方:

             server {
            listen 8080;

            location /foo {
            set $a hello;
            echo_exec /bar;
            }

            location /bar {
            echo "a = [$a]";
            }
            }

            这儿咱们在 lo卿本佳人何小军cation /foo 中,运用第三方模块 ngx_echo 供给的 echo_exec 装备指令,建议到 location /bar 的“内部跳转”。所谓“内部跳转”,便是在处理恳求的进程中,于服务器内部,从一个 location 跳转到另一个 location 的进程。这不同于运用 HTTP 状况码 301 和 302 所进行的“外部跳转”,由于后者是由 HTTP 客户端合作进行跳转的,并且在客户端,用户能够通过浏览器地址栏这样的界面,看到恳求的 URL 地址发生了改变。内部跳转和 Bourne Shell(或 Bash)中的 exec 指令很像,都是“有去无回”。另一个附近的比方是 C 语言中的 goto 句子。

            已然是内部跳转,当时正在处理的恳求就仍是本来那个,仅仅当时的 location 发生了改变,所以仍是本来的那一套 Nginx 变量的容器副本。对应到上例,假如咱们恳求的是 /foo 这个接口,那么整个作业流程是这样的:先在 location /foo 中通过 set 指令将 $a 变量的值赋为字符串 hello,然后通过 echo_exec 指令建议内部跳转,又进入到 location /bar 中,再输出 $a 变量的值。由于 $a 仍是本来的 $a,所以咱们能够希望得到 hello 这行输出。测验证明了这一点:

            $ curl localhost:8080/foo
            a = [hello]

            但假如咱们从客户端直接拜访 /bar 接口,就会得到空的 $a 变量的值,由于它依赖于 location /foo 来对 $a 进行初始化。

            从上面这个比方咱们看到,一个恳求在其处理进程中,即便阅历多个不同的 location 装备块,它运用的仍是同一套 Nginx 变量的副本。这儿,咱们也初次触及到了“内部跳转”这个概念。值得一提的是,规范 ngx_rewrite 模块的 rewrite 装备指令其实也能够建议“内部跳转”,例如上面那个比方用 rewrite 装备指令能够改写成下面这样的方式:

             server {

            listen 8080;

            location /foo {
            set $a hello;
            rewrite ^ /bar;
            }

            location /bar {
            echo "a = [$a]";
            }
            }

            其作用和运用 echo_exec 是完全相同的。后边咱们还会专门介绍这个 rewrite 指令的更多用法,比方建议 301 和 302 这样的“外部跳转”。

            从上面这个比方咱们看到,Nginx 变量值容器的生命期是与当时正在处理的恳求绑定的,而与 location 无关。

            前面咱们接触到的都是通过 set 指令隐式创立的 Nginx 变量。这些变量咱们一般称为“用户自界说变量”,或许更简略一些,“用户变量”。已然有“用户自界说变量”,天然也就有由 Nginx 中心和各个 Nginx 模块供给的“预界说变量”,或许说“内建变量”(builtin variables)。

            Nginx 内建变量最常见的用处便是获取关于恳求或呼应的各种信息。例如由 ngx_http_core 模块供给的内建变量 $uri,能够用来获取当时恳求的 URI(通过解码,并且不含恳求参数),而 $request_uri 则用来获取恳求最原始的 URI (未经解码,并且包括恳求参数)。请看下面这个比方:

             location /test {
            echo "uri = $uri";
            echo "request_uri = $request_uri";
            }

            这儿为了简略起见,连 server 装备块也省掉了,和前面一切示例相同,咱们监听的依然是 8080 端口。在这个比方里,咱们把 $uri 和 $request_uri 的值输出到呼应体中去。下面咱们用不同的恳求来测验一下这个 /test 接口:

            $ curl 'http://localhost:8080/test'
            uri = /test
            request_uri = /test

            $ curl 'http://localhost:8080/test?a=3&b=4'
            uri = /test
            request_uri = /test?a=3&b=4

            $ curl 'http://localhost:8080/test/hello%20world?a=3&b=4'
            uri = /test/hello world
            request_uri = /test/hello%20world?a=3&b=4

            另一个特别常用的内建变量其实并不是独自一个变量,而是有无限多变种的一群变量,即姓名以 arg_ 最初的一切变量,咱们估且称之为 $arg_XXX 变量群。一个比方是 $arg_name,这个变量的值是当时恳求名为 name 的 URI 参数的值,并且仍是未解码的原始方式的值。咱们来看一个比较完好的示例:

             location /test {
            echo "name: $arg_name";
            echo "class: $arg_class";
            }

            然后在指令行上运用各种参数组合去恳求这个 /test 接口:

             $ curl 'http://localhost:8080/test'
            name:
            class:

            $ curl 'http://localhost:8080/test?name=Tom&class=3'
            name: Tom
            class: 3

            $ curl 'http://localhost:8080/test?name=hello%20world&class=9'
            name: hello%20world
            class: 9

            其实 $arg_name 不只能够匹配 name 参数,也能够匹配 NAME 参数,抑或是 Name,等等:

             $ curl 'http://loc一号平台下载安装-每日学点---nginx变量使用方法详解(2)alhost:8080/test?NAME=Marry'
            name: Marry
            class:

            $ curl 'http://localhost:8080/test?Name=Jimmy'
            name: Jimmy
            class:

            Nginx 会在匹配参数名之前,主动把原始恳求中的参数名调整为悉数小写的方式。

            假如你想对 URI 参数值中的 %XX 这样的编码序列进行解码,能够运用第三方 ngx_set_misc 模块供给的 set_unescape_uri 装备指令:

             location /test {
            set_unescape_uri $name $arg_name;
            set_unescape_uri $class $arg_class;
            echo "name: $name";
            echo "class: $class";
            }

            现在咱们再看一下作用:

            $ curl 'http://localhost:8080/test?name=hello%20world&class=9'
            name: hello world
            class: 9

            空格公然被解码出来了!

            从这个比方咱们一起能够看到,这个 set_unescape_uri 指令也像 set 指令那样,具有主动创立 Nginx 变量的功用。后边咱们还会专门介绍到 ngx_set_misc 模块。

            像 $arg_XXX 这种类型的变量具有无穷无尽种或许的姓名,所以它们并不对应任何寄存值的容器。并且这种变量在 Nginx 中心中是通过特别处理的,第三方 Nginx 模块是不能供给这样充溢魔法的内建变量的。

            相似 $arg_XXX 的内建变量还有不少,比方用来取 cookie 值的 $cookie_XXX 变量群,用来取恳求头的 $http_XXX 变量群,以及用来取呼应头的 $sent_http_XXX 变量群。这儿就不逐个介绍了一号平台下载安装-每日学点---nginx变量使用方法详解(2),感兴趣的读者能够参阅 ngx_http_core 模块的官方文档。

            需求指出的是,许多内建变量都是只读的,比方咱们方才介绍的 $uri 和 $request_uri. 对只读变量进行赋值是应当肯定防止的,由于会有意想不到的结果,比方:

             $ curl 'http://localhost:8080/test?name=hello%20world&class=9'
            name: hello world
            class: 9

            这个有问题的装备会让 Nginx 在发动的时分报出一条令人匪夷所思的过错:

            [emerg] the duplicate "uri" variable in ...

            假如你测验改写别的一些只读的内建变量,比方 $arg_XXX 变量,在某些一号平台下载安装-每日学点---nginx变量使用方法详解(2) Nginx 的版别中乃至或许导致进程溃散。

            请关注微信公众号
            微信二维码
            不容错过
            Powered By Z-BlogPHP