
在Nginx中使用時log_subrequest on
,如何辨識子請求的日誌行?
Apache 有該變量IS_SUBREQ
,但 Nginx 似乎沒有等效的變數。
我正在使用該slice
模組並處理我的日誌麋鹿並且需要將主請求的日誌行與子請求的日誌行分開。
謝謝
答案1
長話短說
有一種方法,但需要一些程式設計。
- 從中刪除查詢字串部分
$request_uri
- URI-轉義結果
- 添加
$query_string
,如果有的話 - 添加
$query_string
到$uri
- 比較增強版
$uri
和修改版$request_uri
,如果它們不相等,則您剛剛發現了一個子請求。
長答案
目前,似乎沒有辦法用簡單的方法來區分使用者互動的請求和子請求多變的就像阿帕契一樣。就像$is_subreq
簡單的事情不可用。 (nginx 開發團隊,有人嗎?)
目前我正在為 nginx 編寫一個 htaccess 插件,我需要找到一種方法來確保當前請求是原始請求。這可以透過以下方式實現$uri
與相比$request_uri
,如果它們不同,則該請求是後續請求。
但當心,如果你大膽地比較變量,你會失敗:
$uri
缺少它$query_string
並且是 URL 解碼的,而 則$request_uri
保持不變(仍然編碼),並附加其查詢字符串。
這是從我的實際專案(Lua 中的 htaccess 實作)中截取的程式碼,您可以在其中看到我是如何完成的:
local org_request_uri = ngx.var.request_uri
-- The original requested URI including query string.
-- Make sure uri doesn't end on '?', as request_uri will never match that.
org_request_uri_path = org_request_uri:match('^[^%?]+')
if org_request_uri:len() > org_request_uri_path:len() then
org_request_uri = ngx.unescape_uri(org_request_uri_path)..
org_request_uri:sub(org_request_uri_path:len()+1)
else
org_request_uri = ngx.unescape_uri(org_request_uri_path)
end
local request_uri = ngx.var.uri -- The actual requested URI including query string
if ngx.var.query_string then
request_uri = request_uri..'?'..ngx.var.query_string
end