
Ao usar log_subrequest on
no Nginx, como posso identificar linhas de log que são subsolicitações?
O Apache possui a variável IS_SUBREQ
, mas o Nginx não parece ter um equivalente.
Estou usando o slice
módulo e processando meus logs comALCEe precisa separar as linhas de log para solicitações principais das linhas de log para subsolicitações.
Obrigado
Responder1
DR
Existe uma maneira, mas não sem um pouco de programação envolvida.
- Remover parte da string de consulta de
$request_uri
- URI-desescape do resultado
- Adicione o
$query_string
, se houver - Adicione o
$query_string
a$uri
- Compare o aprimorado
$uri
com o modificado$request_uri
, se eles não forem iguais, você acabou de descobrir uma subsolicitação.
Resposta longa
Atualmente, parece não haver maneira de distinguir entre solicitações e subsolicitações interagidas pelo usuário com uma simplesvariávelcomo no Apache. Algo como $is_subreq
simplesmentenão está disponível. (equipe de desenvolvimento nginx, alguém?)
No momento estou programando um plugin htaccess para nginx, onde precisava encontrar uma maneira de garantir que a solicitação atual seja a original. Isto pode ser alcançado porem comparação $uri
com$request_uri
e, se forem diferentes, a solicitação será um acompanhamento.
Mastome cuidado, se você comparar as variáveis com ousadia, você falhará:
$uri
não possui seu $query_string
e é decodificado por URL, enquanto $request_uri
permanece intacto (ainda codificado), com sua string de consulta anexada.
Aqui está um código extraído do meu projeto atual (implementação do htaccess em Lua), onde você pode ver como fiz isso:
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