ngx.req.socket
語(yǔ)法: tcpsock, err = ngx.req.socket()
語(yǔ)法: tcpsock, err = ngx.req.socket(raw)
上下文: rewrite_by_lua*, access_by_lua*, content_by_lua*
返回一個(gè)包含了下游連接的只讀的cosocket對(duì)象举塔。在這個(gè)對(duì)象里面计寇,只支持receive和receiveuntil方法故源。
在發(fā)生錯(cuò)誤的情況下,將會(huì)返回一個(gè)nil
值和一個(gè)描述錯(cuò)誤的字符串威恼。
這個(gè)方法返回的socket對(duì)象經(jīng)常被用來(lái)讀取請(qǐng)求的body竹祷,以一個(gè)流的方式擅编。不要開(kāi)啟lua_need_request_body指令攀细,并且不要將這個(gè)調(diào)用與ngx.req.read_body和ngx.req.discard_body混合使用。
如果任何請(qǐng)求的body數(shù)據(jù)已經(jīng)被預(yù)讀到Nginx內(nèi)核請(qǐng)求header緩沖區(qū)中爱态,結(jié)果cosocket對(duì)象要小心的處理這些來(lái)避免這種預(yù)讀取中潛在的數(shù)據(jù)丟失谭贪。分塊請(qǐng)求的body在這個(gè)API中不支持。
從v0.9.0
版本開(kāi)始锦担,這個(gè)方法接受一個(gè)可選的 boolean raw
參數(shù)俭识。當(dāng)這個(gè)參數(shù)是true
,這個(gè)方法返回一個(gè)全雙工的cosocket對(duì)象包裝原始的下游連接套接字洞渔,在這里你可以調(diào)用receive, receiveuntil, 和 send方法套媚。
當(dāng)raw
參數(shù)是true
,要求這里沒(méi)有從之前ngx.say, ngx.print, 或者 ngx.send_headers 調(diào)用時(shí)未解決的數(shù)據(jù)存在磁椒。所以堤瘤,如果你之前有這些下游輸出調(diào)用,你應(yīng)該在調(diào)用ngx.req.socket(true)
之前調(diào)用ngx.flush(true)來(lái)保證這里沒(méi)有未解決的輸出數(shù)據(jù)浆熔。如果請(qǐng)求body還沒(méi)有被讀取本辐,那么"raw socket"也可以被用來(lái)讀取請(qǐng)求的body。
你可以使用通過(guò)ngx.req.socket(true)
返回的“raw request socket”來(lái)實(shí)現(xiàn)花哨的協(xié)議例如WebSocket蘸拔,或者只是發(fā)出你自己的未加工的HTTP響應(yīng)頭或者body數(shù)據(jù)师郑。你可以參考lua-resty-websocket library的一個(gè)真實(shí)世界的例子环葵。
這個(gè)方法首先從v0.5.0rc1
版本被介紹调窍。
ngx.exec
語(yǔ)法: ngx.exec(uri,args?)
上下文: rewrite_by_lua*, access_by_lua*, content_by_lua*
做一個(gè)內(nèi)部重定向到uri
附帶參數(shù)arg
并且和echo-nginx-module中的echo_exec相似。
ngx.exec('/some-location');
ngx.exec('/some-location', 'a=3&b=5&c=6');
ngx.exec('/some-location?a=3&b=5', 'c=6');
這個(gè)可選的第二個(gè)參數(shù)args
可以被用來(lái)指定額外的URI查詢參數(shù)张遭,例如:
ngx.exec("/foo", "a=3&b=hello%20world")
作為另一種選擇邓萨,一個(gè)Lua table中可以被當(dāng)做args
參數(shù)傳遞,ngx_lua來(lái)展開(kāi)URI轉(zhuǎn)義和字符串連接。
ngx.exec("/foo",{ a = 3, b = "hello world" })
這個(gè)結(jié)果和之前的例子是完全相同的菊卷。
通過(guò)Lua table傳遞args
參數(shù)的形式和通過(guò)使用ngx.encode_args方法是完全一樣的缔恳。
同樣也支持命名的location但是第二個(gè)args
參數(shù)將會(huì)被忽略掉,如果查詢字符串存在并且新location會(huì)繼承自以前的location(如果有的話)洁闰。
在下面的例子中歉甚,GET /foo/file.php?a=hello
將會(huì)返回“hello”而不是“goodbye”。
location /foo {
content_by_lua_block {
ngx.exec("@bar","a=goodbye");
}
}
location @bar {
content_by_lua_block {
local args = ngx.req.get_uri_args()
for key, val in pairs(args) do
if key == "a" then
ngx.say(val)
end
end
}
}
注意ngx.exec
方法和ngx.redirect并不一樣扑眉,這是由于它是一個(gè)純粹的外部重定向并且不包括額外的HTTP流量纸泄。
并且注意這個(gè)方法調(diào)用終止當(dāng)前請(qǐng)求的處理并且它 必須 在ngx.send_headers或者ngx.print 或 ngx.say明確響應(yīng)body輸出之前調(diào)用赖钞。
建議編碼時(shí)候,將這個(gè)方法調(diào)用和return
語(yǔ)句結(jié)合聘裁,例如:return ngx.exec(...)
可以在除了header_filter_by_lua*之外的上下文中使用雪营,以強(qiáng)調(diào)程序已經(jīng)被終止的事實(shí)。
ngx.redirect
語(yǔ)法: ngx.redirect(uri, status?)
上下文: rewrite_by_lua*, access_by_lua*, content_by_lua*
發(fā)出一個(gè)HTTP 301
或者302
重定向到uri
衡便。
這個(gè)可選的status
參數(shù)指定要使用的HTTP狀態(tài)∠灼穑現(xiàn)在支持下面的狀態(tài)碼:
301
-
302
(默認(rèn)) 303
307
默認(rèn)的是 302
(ngx.HTTP_MOVED_TEMPORARILY
)
這里有一個(gè)例子,假設(shè)當(dāng)前的服務(wù)器名稱是localhost
镣陕,并且監(jiān)聽(tīng)的端口是 1984:
return ngx.redirect("/foo")
等價(jià)于
return ngx.redirect("/foo", ngx.HTTP_MOVED_TEMPORARILY)
支持重定向任意外部的URL谴餐,例如:
return ngx.redirect("http://www.google.com")
我們也可以直接使用數(shù)值代碼作為第二個(gè)status
參數(shù):
return ngx.redirect("/foo",301)
這個(gè)方法和標(biāo)準(zhǔn)ngx_http_rewrite_module中的附帶redirect
修飾符的rewrite 指令類似,例如茁彭,這個(gè)nginx.conf
片段
rewrite ^ /foo? redirect; # nginx config
等價(jià)于下面的Lua代碼
return ngx.redirect('/foo'); -- Lua code
而
rewrite ^ foo? permanent; #nginx config
等價(jià)于
return ngx.redirect('/foo',ngx.HTTP_MOVED_PERMANENTLY) -- Lua code
也可以指定URI參數(shù)总寒,例如:
return ngx.redirect('/foo?a=3&b=4')
注意這個(gè)方法調(diào)用終止當(dāng)前請(qǐng)求的運(yùn)行并且它 必須 在ngx.send_headers調(diào)用或者通過(guò)ngx.print或者 ngx.say明確響應(yīng)body輸出之前。
建議的編碼風(fēng)格是理肺,將這個(gè)方法調(diào)用與一個(gè)return
聲明結(jié)合摄闸,例如,return ngx.redirect(...)
在除了header_filter_by_lua*之外的上下文中被接受妹萨,來(lái)強(qiáng)調(diào)一個(gè)事實(shí)就是這個(gè)請(qǐng)求處理已經(jīng)被終止了年枕。
ngx.send_headers
語(yǔ)法: ok, err = ngx.send_headers()
上下文: rewrite_by_lua*,access_by_lua*,content_by_lua*
顯示的發(fā)送出響應(yīng)頭。
從v0.8.3
版本這個(gè)方法在成功的時(shí)候返回1
乎完,在其他情況下返回一個(gè)nil
和一個(gè)字符串描述錯(cuò)誤熏兄。
注意通常情況下不需要手動(dòng)發(fā)送出響應(yīng)頭,因?yàn)閚gx_lua會(huì)在內(nèi)容通過(guò) ngx.say 或者 ngx.print輸出之前自動(dòng)的將響應(yīng)頭發(fā)出树姨,或者當(dāng)content_by_lua*正常退出時(shí)摩桶。
ngx.headers_sent
語(yǔ)法: value = ngx.headers_sent
上下文: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*
如果響應(yīng)頭被發(fā)出去了(通過(guò)ngx_lua)將會(huì)返回true
,其他情況返回false
帽揪。
這個(gè)API首先在ngx_lua v0.3.1rc6版本中被介紹硝清。
ngx.print
語(yǔ)法: ok,err = ngx.print(...)
上下文: rewrite_by_lua*, access_by_lua*, content_by_lua*
發(fā)出已經(jīng)連接過(guò)的參數(shù)到HTTP客戶端(作為響應(yīng)body)。如果響應(yīng)頭沒(méi)有被發(fā)送转晰,這個(gè)方法將會(huì)首先發(fā)出headers然后發(fā)出body數(shù)據(jù)芦拿。
從v0.8.3
,這個(gè)方法在成功后返回1
查邢,在其他情況下返回nil
和一個(gè)描述錯(cuò)誤信息的字符串蔗崎。
Lua nil
值將會(huì)輸出"nil"
字符串并且Lua boolean值將會(huì)分別輸出"true"
和"false"
文字字符串。
嵌套的字符串是數(shù)組是允許的并且數(shù)組中的元素將會(huì)被一個(gè)接著一個(gè)的輸出:
local table = {
"hello, ",
{"world: ", true, " or ", false,
{": ", nil}}
}
ngx.print(table)
將會(huì)產(chǎn)生輸出:
hello, world: true or false: nil
非數(shù)組的表參數(shù)將會(huì)導(dǎo)致拋出一個(gè)Lua異常扰藕。
這個(gè)ngx.null
常量將會(huì)產(chǎn)生"null"
字符串輸出缓苛。
這是一個(gè)異步的調(diào)用并且將會(huì)立即返回而不需要等待所有的數(shù)據(jù)要寫入系統(tǒng)發(fā)送緩存區(qū)中。要開(kāi)啟同步模式邓深,在調(diào)用ngx.print
之后調(diào)用ngx.flush(true)
未桥。這個(gè)對(duì)流輸出特別有用番官。更多細(xì)節(jié)查看ngx.flush。
請(qǐng)注意一點(diǎn)ngx.print
和 ngx.say會(huì)總是調(diào)用整個(gè)Nginx輸出body過(guò)濾鏈钢属,這個(gè)是一個(gè)昂貴的操作徘熔。所以在一個(gè)緊密循環(huán)中無(wú)論調(diào)用哪一個(gè)都要小心。你自己在Lua中緩沖數(shù)據(jù)并且保存調(diào)用淆党。
ngx.say
語(yǔ)法: ok, err = ngx.say(...)
上下文: rewrite_by_lua*, access_by_lua*, content_by_lua*
和ngx.print類似但是多發(fā)出一個(gè)換行符酷师。
ngx.log
語(yǔ)法: ngx.log(log_level, ...)
上下文: init_by_lua*, init_worker_by_lua*, set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua*, ngx.timer.*, balancer_by_lua*, ssl_certificate_by_lua*, ssl_session_fetch_by_lua*, ssl_session_store_by_lua*
通過(guò)給定的logging級(jí)別來(lái)連接參數(shù)到error.log中。
Lua nil
參數(shù)是接受的染乌,并且結(jié)果為文字的"nil"
字符串山孔,同時(shí)Lua boolean結(jié)果為文字的"true"
或者"false"
字符串輸出。并且ngx.null
常量將會(huì)產(chǎn)生"null"
字符串輸出荷憋。
這個(gè)log_level
參數(shù)可以取常數(shù)例如ngx.ERR
和ngx.WARN
.檢查Nginx log level constants來(lái)獲取細(xì)節(jié)台颠。
這里有個(gè)Nginx內(nèi)核硬編碼的2048
字節(jié)的限制在錯(cuò)誤信息長(zhǎng)度上。這個(gè)限制包含結(jié)尾換行開(kāi)頭的時(shí)間戳勒庄。如果信息大小超過(guò)了這個(gè)限制串前,Nginx會(huì)相應(yīng)的截取信息字符串。這個(gè)限制可以通過(guò)編輯在Nginx源碼樹(shù)種的src/core/ngx_log.h
文件的NGX_MAX_ERROR_STR
宏定義來(lái)修改实蔽。
ngx.flush
語(yǔ)法: ok, err = ngx.flush(wait?)
上下文: rewrite_by_lua*, access_by_lua*, content_by_lua*
Flush 響應(yīng)輸出到客戶端荡碾。
ngx.flush
接受一個(gè)可選的boolean wait
參數(shù)(默認(rèn):false
),首先在v0.3.1rc34
版本中介紹局装。當(dāng)通過(guò)默認(rèn)的參數(shù)調(diào)用的時(shí)候坛吁,它纏身給一個(gè)異步的調(diào)用(立即返回而不等待輸出數(shù)據(jù)被寫入到系統(tǒng)的發(fā)送緩沖中)。通過(guò)wait
參數(shù)設(shè)置為true
調(diào)用這個(gè)方法會(huì)轉(zhuǎn)變?yōu)橥侥J健?/p>
在同步模式铐尚,這個(gè)方法將會(huì)不會(huì)返回直到所有的輸出數(shù)據(jù)已經(jīng)被寫入到系統(tǒng)輸出緩沖中或者直到send_timeout設(shè)置已經(jīng)過(guò)期了拨脉。注意使用Lua協(xié)同程序機(jī)制意味著這個(gè)方法并不阻塞Nginx事件循環(huán)及時(shí)在同步模式。
當(dāng)ngx.flush(true)
在ngx.print或者ngx.say之后被立即調(diào)用宣增,這回導(dǎo)致后者的方法在同步模式下運(yùn)行玫膀。這個(gè)在流輸出中特別有用。
注意ngx.flush
在HTTP 1.0輸出緩沖模式中并不是一個(gè)功能统舀。查看HTTP 1.0 support匆骗。
從v0.8.3
開(kāi)始這個(gè)方法在成功之后返回1
劳景,在其他情況下返回nil
和一個(gè)字符串來(lái)描述錯(cuò)誤誉简。
ngx.exit
語(yǔ)法: ngx.exit(status)
上下文: rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, ngx.timer.*, balancer_by_lua*, ssl_certificate_by_lua*, ssl_session_fetch_by_lua*, ssl_session_store_by_lua*
當(dāng)status >= 200
(例如,ngx.HTTP_OK
和以上)盟广,它將會(huì)中斷當(dāng)前的請(qǐng)求并且返回狀態(tài)碼給nginx闷串。
當(dāng)status == 0
(例如,ngx.OK
)筋量,它將會(huì)退出當(dāng)前的階段處理器(或者內(nèi)容處理器如果 content_by_lua*指令被使用了)并且為當(dāng)前請(qǐng)求繼續(xù)運(yùn)行后面的階段(如果有的話)烹吵。
這個(gè)status
參數(shù)可以使ngx.OK
, ngx.ERROR
碉熄,ngx.HTTP_NOT_FOUND
,ngx.HTTP_MOVED_TEMPORARILY
肋拔,或者其他 HTTP status constants锈津。
要返回一個(gè)包含當(dāng)前內(nèi)容的錯(cuò)誤頁(yè),可以使用像這樣的代碼片段:
ngx.status = ngx.HTTP_GONE
ngx.say("This is our own content")
-- to cause quit the whole request rather than the current phase handler
ngx.exit(ngx.HTTP_OK)
執(zhí)行的效果:
$ curl -i http://localhost/test
HTTP/1.1 410 Gone
Server: nginx/1.0.6
Date: Thu, 15 Sep 2011 00:51:48 GMT
Content-Type: text/plain
Transfer-Encoding: chunked
Connection: keep-alive
This is our own content
數(shù)值文本可以直接被用在參數(shù)上凉蜂,例如琼梆,
ngx.exit(501)
注意盡管這個(gè)方法接受所有的 HTTP status constants作為輸入,它只接受core constants中的NGX_OK
和NGX_ERROR
窿吩。
還要注意茎杂,這個(gè)方法調(diào)用歐冠終止當(dāng)前請(qǐng)求的處理并且建議的編碼風(fēng)格是將這個(gè)方法調(diào)用歐冠與一個(gè)return
聲明連接,例如纫雁, return ngx.exit(...)
被用來(lái)強(qiáng)調(diào)一個(gè)事實(shí)是請(qǐng)求處理已經(jīng)被終止了煌往。
當(dāng)用在header_filter_by_lua*, balancer_by_lua*, 和
ssl_session_store_by_lua*的上下中時(shí),ngx.exit()
作為一個(gè)異步的操作將會(huì)立即返回轧邪。這個(gè)行為在未來(lái)可能會(huì)改變并且推薦用戶使用上面推薦的return
來(lái)結(jié)合使用刽脖。
ngx.eof
語(yǔ)法: ok, err = ngx.eof()
上下文: rewrite_by_lua*, access_by_lua*, content_by_lua*
顯示的指定響應(yīng)輸出流的結(jié)束。在HTTP 1.1分塊編碼輸出的情況下忌愚,它將只是會(huì)觸發(fā)Nginx內(nèi)核發(fā)送出"last chunk"曾棕。
當(dāng)你在你下游連接中禁用了HTTP 1.1的keep-alive特性時(shí),你可以調(diào)用這個(gè)方法來(lái)寫到HTTP client來(lái)主動(dòng)的關(guān)閉連接菜循。這個(gè)技巧可以用在做一些后臺(tái)工作而不讓HTTP客戶端等待連接翘地,例如下面的例子:
location = /async {
keepalive_timeout 0;
content_by_lua_block {
ngx.say("got the task!")
ngx.eof() -- well written HTTP clients will close the connection at this point
-- access MySQL, PostgreSQL, Redis, Memcached, and etc here...
}
}
但是如果你創(chuàng)建子請(qǐng)求來(lái)訪問(wèn)其他通過(guò)nginx upstream模塊配置的location,那么你應(yīng)該配置這些upstream模塊來(lái)忽略客戶端連接中斷癌幕,如果他們不是默認(rèn)情況的話衙耕。例如,在默認(rèn)情況下標(biāo)準(zhǔn)的ngx_http_proxy_module將會(huì)同時(shí)中斷子請(qǐng)求和主請(qǐng)求勺远,當(dāng)客戶端重點(diǎn)連接時(shí)橙喘,所以在你的location塊ngx_http_proxy_module配置中開(kāi)啟proxy_ignore_client_abort](http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ignore_client_abort) 指令是非常重要的。
proxy_ignore_client_abort on;
一個(gè)更好的來(lái)做后臺(tái)工作的方式是使用ngx.timer.atAPI接口胶逢。
從v0.8.3
開(kāi)始這個(gè)方法在成功時(shí)候返回1
厅瞎,在其他錯(cuò)誤情況下返回nil
和一個(gè)字符串描述。
ngx.sleep
語(yǔ)法: ngx.sleep(seconds)
上下文: rewrite_by_lua*, access_by_lua*, content_by_lua*, ngx.timer.*, ssl_certificate_by_lua*, ssl_session_fetch_by_lua*
睡眠指定的描述而不阻塞初坠『汪ぃ可以指定一個(gè)時(shí)間分辨率達(dá)到0.001秒(例如:一毫秒)。
在后面的場(chǎng)景碟刺,這個(gè)方法使用的是Nginx timers锁保。
從0.7.20
版本開(kāi)始,這個(gè)0
時(shí)間參數(shù)也可以被指定。
這個(gè)方法首先在0.5.0rc30
版本中被介紹爽柒。
ngx.escape_uri
語(yǔ)法: newstr = ngx.escape_uri(str)
上下文: init_by_lua*, init_worker_by_lua*, set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua*, ngx.timer.*, balancer_by_lua*, ssl_certificate_by_lua*, ssl_session_fetch_by_lua*, ssl_session_store_by_lua*
編碼str
來(lái)作為URI組件吴菠。
ngx.unescape_uri
語(yǔ)法: newstr = ngx.unescape_uri(str)
上下文: init_by_lua*, init_worker_by_lua*, set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua*, ngx.timer.*, balancer_by_lua*, ssl_certificate_by_lua*
解碼str
,str是一個(gè)編碼過(guò)的URI組件浩村。
例如:
ngx.say(ngx.unescape_uri("b%20r56+7"))
得到輸出
b r56 7
ngx.encode_args
語(yǔ)法: str = ngx.encode_args(table)
上下文: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua*, ngx.timer.*, balancer_by_lua*, ssl_certificate_by_lua*
根據(jù)URI的編碼規(guī)則編碼Lua table為一個(gè)查詢參數(shù)字符串做葵。
例如,
ngx.encode_args({foo = 3, ["b r"] = "hello world"})
產(chǎn)生
foo=3&b%20r=hello%20world
這個(gè)table的keys必須是Lua字符串心墅。
同時(shí)也支持多值查詢參數(shù)蜂挪。使用一個(gè)lua table來(lái)作為參數(shù)值,例如:
ngx.encode_args({baz = {32, "hello"}})
得到
baz=32&baz=hello
如果這個(gè)value table為空那么影響等價(jià)于nil
值嗓化。
同時(shí)也支持boolean參數(shù)值棠涮,例如,
ngx.encode_args({a = true, b = 1})
產(chǎn)生
a&b=1
如果這個(gè)參數(shù)值為false刺覆,那么影響等價(jià)于nil
值严肪。
這個(gè)方法首先在 v0.3.1rc27
版本中被介紹。
ngx.decode_args
語(yǔ)法: table = ngx.decode_args(str, max_args?)
上下文: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua*, ngx.timer.*, balancer_by_lua*, ssl_certificate_by_lua*, ssl_session_fetch_by_lua*, ssl_session_store_by_lua*
將一個(gè)編碼過(guò)的查詢字符串解碼為一個(gè)Lua table谦屑。這個(gè)是ngx.encode_args的相反的方法驳糯。
這個(gè)可選的max_args
參數(shù)可以被用來(lái)指定通過(guò)str
參數(shù)解析的參數(shù)數(shù)量的最大值。默認(rèn)情況下氢橙,默認(rèn)解析100個(gè)請(qǐng)求參數(shù)(包括這些名字相同的)并且額外的URI參數(shù)會(huì)被默默的丟棄來(lái)防止?jié)撛诘木芙^服務(wù)攻擊酝枢。
這個(gè)參數(shù)可以被設(shè)置為0來(lái)移除對(duì)接受請(qǐng)求參數(shù)處理的限制:
local args = ngx.decode_args(str, 0)
強(qiáng)烈不建議移除max_args
。
這個(gè)方法首先在v0.5.0rc29
版本中被介紹悍手。
encode_base64
語(yǔ)法: newstr = ngx.encode_base64(str, no_padding?)
上下文: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua*, ngx.timer.*, balancer_by_lua*, ssl_certificate_by_lua*, ssl_session_fetch_by_lua*, ssl_session_store_by_lua*
編碼str
成為一個(gè)base64摘要帘睦。
從0.9.16
版本開(kāi)始,一個(gè)可選的boolean類型no_padding
參數(shù)可以被指定來(lái)控制是否base64摘要應(yīng)該被追加到結(jié)果摘要中(默認(rèn)是false
坦康,例如竣付,使用啟用追加)。
ngx.decode_base64
語(yǔ)法: newstr = ngx.decode_base64(str)
上下文: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua*, ngx.timer.*, balancer_by_lua*, ssl_certificate_by_lua*, ssl_session_fetch_by_lua*, ssl_session_store_by_lua*
解碼str
參數(shù)將base64摘要成為一個(gè)原始的形式滞欠。如果str
不是正常形式返回nil
古胆。
ngx.crc32_short
語(yǔ)法: intval = ngx.crc32_short(str)
上下文: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua*, ngx.timer.*, balancer_by_lua*, ssl_certificate_by_lua*, ssl_session_fetch_by_lua*, ssl_session_store_by_lua*
計(jì)算str
字符串的CRC-32(循環(huán)冗余碼)摘要。
這個(gè)方法對(duì)較短的str
輸入(例如筛璧,小于30~60bytes)表現(xiàn)較好逸绎,和ngx.crc32_long相比。這個(gè)結(jié)果和ngx.crc32_long完全一樣夭谤。
幕后的實(shí)現(xiàn)棺牧,這個(gè)只是一個(gè)薄薄的對(duì)Nginx核心中的ngx_crc32_short
的封裝。
這個(gè)API首先在v0.3.1rc8
版本中被介紹沮翔。
ngx.crc32_long
語(yǔ)法: intval = ngx.crc32_long(str)
上下文: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua*, ngx.timer.*, balancer_by_lua*, ssl_certificate_by_lua*, ssl_session_fetch_by_lua*, ssl_session_store_by_lua*
計(jì)算參數(shù)str
的HMAC-SHA1摘要陨帆,并且返回使用密鑰<secret_key>
的結(jié)果。
原始字節(jié)形式的HMAC-SHA1
證書將會(huì)生成采蚀,使用ngx.encode_base64疲牵,例如,如果需要的話將結(jié)果以結(jié)果的文本表示榆鼠。
例如纲爸,
local key = "thisisverysecretstuff"
local src = "some string we want to sign"
local digest = ngx.hmac_sha1(key, src)
ngx.say(ngx.encode_base64(digest))
將會(huì)導(dǎo)致輸出:
R/pvxzHC4NLtj7S+kXFg/NePTmk=
這個(gè)API需要在Nginx編譯的時(shí)候開(kāi)啟OpenSSL庫(kù)(通常在./configure
腳本里面?zhèn)魅?code>--with-http_ssl_module參數(shù))
這個(gè)方法首先在v0.3.1rc29
版本中被介紹。
ngx.md5
語(yǔ)法: ngx.md5(str)
上下文: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua*, ngx.timer.*, balancer_by_lua*, ssl_certificate_by_lua*, ssl_session_fetch_by_lua*, ssl_session_store_by_lua*
返回str
參數(shù)的16進(jìn)制的MD5摘要妆够。
例如识啦,
location = /md5 {
content_by_lua_block { ngx.say(ngx.md5("hello")) }
}
產(chǎn)生輸出
5d41402abc4b2a76b9719d911017c592
查看ngx.md5_bin,如果需要原始的MD5摘要。
ngx.sha1_bin
語(yǔ)法: digest = ngx.sha1_bin(str)
上下文: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua*, ngx.timer.*, balancer_by_lua*, ssl_certificate_by_lua*, ssl_session_fetch_by_lua*, ssl_session_store_by_lua*
返回str
參數(shù)的二級(jí)制形式的SHA-1摘要神妹。
這個(gè)方法需要在Nginx編譯時(shí)的SHA-1支持颓哮。(這個(gè)經(jīng)常意味著在構(gòu)建Nginx時(shí)需要安裝OpenSSL)
這個(gè)方法首先在v0.5.0rc6
中被介紹。