# 【Lua】Nginx 變量

<div id="bkmrk-%E4%BD%BF%E7%94%A8ng%E8%AE%8A%E9%87%8F"><span class="graybg"><span>使用Ng變量</span></span></div><span>要在OpenResty中引用Nginx變量，可以使用 </span><span class="crayon-syntax crayon-syntax-inline  crayon-theme-gmem-github crayon-theme-gmem-github-inline crayon-font-consolas" id="bkmrk-ngx%C2%A0.%C2%A0var%C2%A0.%C2%A0variable"><span class="crayon-pre crayon-code"><span class="crayon-v"><span>ngx </span></span><span class="crayon-sy"><span>. </span></span><span class="crayon-t"><span>var </span></span><span class="crayon-sy"><span>. </span></span><span class="crayon-v"><span>VARIABLE</span></span></span></span><span>，要將變量從字符串轉換為數字，可以使用 </span><span class="crayon-syntax crayon-syntax-inline  crayon-theme-gmem-github crayon-theme-gmem-github-inline crayon-font-consolas" id="bkmrk-tonumber"><span class="crayon-pre crayon-code"><span class="crayon-v"><span>tonumber</span></span></span></span><span>函數。</span>

```Lua
-- 黑名单
local black_ips = {["127.0.0.1"]=true}
 
-- 当前客户端IP
local ip = ngx.var.remote_addr
if true == black_ips[ip] then
    -- 返回相应的HTTP状态码
    ngx.exit(ngx.HTTP_FORBIDDEN)
end
```

<span>經常用到的Ng變量如下表：</span>

<table class="full-width fixed-word-wrap" id="bkmrk-%E8%AE%8A%E9%87%8F-%E8%AA%AA%E6%98%8E-arg_name-%E8%AB%8B%E6%B1%82%E4%B8%AD%E7%9A%84n"><thead><tr><td><span>變量</span></td><td><span>說明</span></td></tr></thead><tbody><tr><td><span>arg\_name</span></td><td><span>請求中的name參數</span></td></tr><tr><td><span>args</span></td><td><span>請求中的參數</span></td></tr><tr><td><span>binary\_remote\_addr</span></td><td><span>遠程地址的二進製表示</span></td></tr><tr><td><span>body\_bytes\_sent</span></td><td><span>已發送的消息體字節數</span></td></tr><tr><td><span>content\_length</span></td><td><span>HTTP請求信息裡的"Content-Length"</span></td></tr><tr><td><span>content\_type</span></td><td><span>請求信息裡的"Content-Type"</span></td></tr><tr><td><span>document\_root</span></td><td><span>針對當前請求的根路徑設置值</span></td></tr><tr><td><span>document\_uri</span></td><td><span>與$uri相同; 比如/test2/test.php</span></td></tr><tr><td><span>host</span></td><td><span>請求信息中的"Host"，如果請求中沒有Host行，則等於設置的服務器名</span></td></tr><tr><td><span>hostname</span></td><td><span>機器名使用gethostname系統調用的值</span></td></tr><tr><td><span>http\_cookie</span></td><td><span>Cookie信息</span></td></tr><tr><td><span>http\_referer</span></td><td><span>引用地址</span></td></tr><tr><td><span>http\_user\_agent</span></td><td><span>客戶端代理信息</span></td></tr><tr><td><span>http\_via</span></td><td><span>最後一個訪問服務器的Ip地址。</span></td></tr><tr><td><span>http\_x\_forwarded\_for</span></td><td><span>相當於網絡訪問路徑</span></td></tr><tr><td><span>is\_args</span></td><td><span>如果請求行帶有參數，返回“?”，否則返回空字符串</span></td></tr><tr><td><span>limit\_rate</span></td><td><span>對連接速率的限制。此變量支持寫入：</span>

<div data-settings=" no-popup minimize scroll-mouseover"><div data-settings=" show"><div><div><div></div></div><div><div></div></div><div><div></div></div><span class="crayon-language">Lua</span></div></div><div></div><div></div><div><table class="crayon-table"><tbody><tr class="crayon-row"><td class="crayon-nums " data-settings="show"><div><div data-line="crayon-63eb517b82d78653021122-1">1</div><div data-line="crayon-63eb517b82d78653021122-2">2</div></div></td><td class="crayon-code"><div><div><span class="crayon-c">-- 设置当前请求的响应传递速率限制</span></div><div><span class="crayon-v">ngx</span><span class="crayon-sy">.</span><span class="crayon-v">var</span><span class="crayon-sy">.</span><span class="crayon-v">limit\_rate</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-cn">1000</span> </div></div></td></tr></tbody></table>

</div></div></td></tr><tr><td><span>nginx\_version</span></td><td><span>當前運行的nginx版本號</span></td></tr><tr><td><span>pid</span></td><td><span>Worker進程的PID</span></td></tr><tr><td><span>query\_string</span></td><td><span>與$args相同</span></td></tr><tr><td><span>realpath\_root</span></td><td><span>按root指令或alias指令算出的當前請求的絕對路徑。其中的符號鏈接都會解析成真是文件路徑</span></td></tr><tr><td><span>remote\_addr</span></td><td><span>客戶端IP地址</span></td></tr><tr><td><span>remote\_port</span></td><td><span>客戶端端口號</span></td></tr><tr><td><span>remote\_user</span></td><td><span>客戶端用戶名，認證用</span></td></tr><tr><td><span>request</span></td><td><span>用戶請求</span></td></tr><tr><td><span>request\_body</span></td><td><span>這個變量（0.7.58+）包含請求的主要信息。在使用proxy\_pass或fastcgi\_pass指令的location中比較有意義</span></td></tr><tr><td><span>request\_body\_file</span></td><td><span>客戶端請求主體信息的臨時文件名</span></td></tr><tr><td><span>request\_completion</span></td><td><span>如果請求成功，設為"OK"；如果請求未完成或者不是一系列請求中最後一部分則設為空</span></td></tr><tr><td><span>request\_filename</span></td><td><span>當前請求的文件路徑名，比如/opt/nginx/www/test.php</span></td></tr><tr><td><span>request\_method</span></td><td><span>請求的方法，比如"GET"、"POST"等</span></td></tr><tr><td><span>request\_uri</span></td><td><span>請求的URI，帶參數</span></td></tr><tr><td><span>scheme</span></td><td><span>所用的協議，比如http或者是https</span></td></tr><tr><td><span>server\_addr</span></td><td><span>服務器地址，如果沒有用listen指明服務器地址，使用這個變量將發起一次系統調用以取得地址(造成資源浪費)</span></td></tr><tr><td><span>server\_name</span></td><td><span>請求到達的服務器名</span></td></tr><tr><td><span>server\_port</span></td><td><span>請求到達的服務器端口號</span></td></tr><tr><td><span>server\_protocol</span></td><td><span>請求的協議版本，"HTTP/1.0"或"HTTP/1.1"</span></td></tr><tr><td><span>uri</span></td><td><span>請求的URI，可能和最初的值有不同，比如經過重定向之類的</span></td></tr></tbody></table>