長話短說

長話短說

在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

相關內容