Kurz zusammengefasst

Kurz zusammengefasst

Wie kann ich bei der Verwendung log_subrequest onin Nginx Protokollzeilen identifizieren, die Unteranforderungen sind?

Apache hat die Variable IS_SUBREQ, aber Nginx scheint kein Äquivalent zu haben.

Ich verwende das sliceModul 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_stringhinzu
  • Fügen Sie den $query_stringzu$uri
  • Vergleichen Sie die erweiterte $urimit 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_subreqeinfachist 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 $urimit$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: $uriEs fehlt sein $query_stringund es ist URL-decodiert, während $request_uriunverä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

verwandte Informationen