
Wie kann ich bei der Verwendung log_subrequest on
in Nginx Protokollzeilen identifizieren, die Unteranforderungen sind?
Apache hat die Variable IS_SUBREQ
, aber Nginx scheint kein Äquivalent zu haben.
Ich verwende das slice
Modul und verarbeite meine Protokolle mitELCHund Sie müssen die Protokollzeilen für Hauptanforderungen von den Protokollzeilen für Unteranforderungen trennen.
Danke
Antwort1
Kurz zusammengefasst
Es gibt eine Möglichkeit, aber ein wenig Programmierung ist erforderlich.
- Entfernen Sie einen Teil der Abfragezeichenfolge aus
$request_uri
- URI-Unescape des Ergebnisses
- Fügen Sie ggf. die
$query_string
hinzu - Fügen Sie den
$query_string
zu$uri
- Vergleichen Sie die erweiterte
$uri
mit der geänderten$request_uri
. Wenn sie nicht identisch sind, haben Sie gerade eine Unteranforderung entdeckt.
Lange Antwort
Derzeit scheint es keine Möglichkeit zu geben, zwischen benutzerinteragierten Anfragen und Unteranfragen mit einem einfachenVariablewie in Apache. So etwas wie $is_subreq
einfachist nicht verfügbar. (nginx-Entwicklerteam, irgendjemand?)
Im Moment programmiere ich ein htaccess-Plugin für nginx, wo ich einen Weg finden musste, um sicherzustellen, dass die aktuelle Anfrage die ursprüngliche ist. Dies kann erreicht werden durchvergleichen $uri
mit$request_uri
, und wenn sie abweichen, handelt es sich bei der Anfrage um eine Folgeanfrage.
AberSeien Sie vorsichtig, wenn Sie die Variablen dreist vergleichen, werden Sie scheitern:
$uri
Es fehlt sein $query_string
und es ist URL-decodiert, während $request_uri
unverändert (immer noch codiert) bleibt und die Abfragezeichenfolge angehängt ist.
Hier ist ein Codeausschnitt aus meinem aktuellen Projekt (htaccess-Implementierung in Lua), in dem Sie sehen können, wie ich es gemacht habe:
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