
Cuando lo uso log_subrequest on
en Nginx, ¿cómo puedo identificar líneas de registro que son subsolicitudes?
Apache tiene la variable IS_SUBREQ
pero Nginx no parece tener un equivalente.
Estoy usando el slice
módulo y procesando mis registros conALCEy es necesario separar las líneas de registro para las solicitudes principales de las líneas de registro para las subsolicitudes.
Gracias
Respuesta1
TL;DR
Hay una manera, pero no sin un poco de programación.
- Eliminar parte de la cadena de consulta de
$request_uri
- URI-eliminar el resultado
- Agregue el
$query_string
, si lo hubiera - Añadir el
$query_string
a$uri
- Compare lo mejorado
$uri
con lo modificado$request_uri
, si no son iguales entre sí, acaba de descubrir una subsolicitud.
Respuesta larga
Actualmente, parece no haber manera de distinguir entre solicitudes interactuadas por el usuario y subsolicitudes con una simplevariablecomo en apache. Algo así como $is_subreq
simplementeno está disponible. (equipo de desarrollo de nginx, ¿alguien?)
En este momento estoy programando un complemento htaccess para nginx, donde necesitaba encontrar una manera de asegurarme de que la solicitud actual sea la original. Esto se puede lograr medianteComparado $uri
con$request_uri
, y si difieren, la solicitud es un seguimiento.
Peroten cuidado, si compara audazmente las variables, fallará:
$uri
carece de su $query_string
URL y está decodificada, mientras que $request_uri
se deja intacta (todavía codificada), con su cadena de consulta adjunta.
Aquí hay un código extraído de mi proyecto real (implementación de htaccess en Lua), donde puedes ver cómo lo hice:
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