Когда используешь log_subrequest on
в Nginx, как определить строки журнала, являющиеся подзапросами?
В Apache есть переменная IS_SUBREQ
но у Nginx, похоже, нет эквивалента.
Я использую slice
модуль и обработка моих журналов с помощью ELK и необходимо отделить строки журнала для основных запросов от строк журнала для подзапросов.
Спасибо
Способ есть, но без небольшого программирования.
$request_uri
$query_string
, если есть$query_string
к $uri
$uri
с измененным $request_uri
, если они не равны друг другу, вы только что обнаружили подзапрос.В настоящее время, похоже, нет способа отличить запросы, взаимодействующие с пользователем, и подзапросы с помощью простого переменная как в апаче. Что-то вроде $is_subreq
просто не доступен. (команда разработчиков nginx, кто-нибудь?)
В настоящий момент я программирую плагин htaccess для nginx, где мне нужно было найти способ убедиться, что текущий запрос является исходным. Это может быть достигнуто сравнение $uri
с участием $request_uri
, и если они отличаются, запрос является продолжением.
Но быть осторожен, если смело сравнивать переменные, не получится: $uri
не хватает $query_string
и декодируется URL-адресом, а $request_uri
остается нетронутым (все еще закодированным) с прикрепленной строкой запроса.
Вот фрагмент кода из моего реального проекта (реализация htaccess в Lua), где вы можете увидеть, как я это сделал:
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