TL;DR

TL;DR

Как при использовании log_subrequest onNginx определить строки журнала, которые являются подзапросами?

В Apache такая переменная есть IS_SUBREQ, но в Nginx, похоже, нет эквивалента.

Я использую sliceмодуль и обрабатываю свои логи с помощьюЛОСЬи необходимо отделить строки журнала для основных запросов от строк журнала для подзапросов.

Спасибо

решение1

TL;DR

Способ есть, но без небольшого программирования не обойтись.

  • Удалить часть строки запроса из$request_uri
  • URI-разэкранировать результат
  • Добавьте $query_string, если есть
  • Добавить $query_stringк$uri
  • Сравните улучшенный $uriи измененный запросы $request_uri. Если они не равны друг другу, значит, вы обнаружили подзапрос.

Длинный ответ

В настоящее время, похоже, нет способа отличить запросы, интерактивные с пользователем, от подзапросов с помощью простогопеременнаякак в Apache. Что-то вроде $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

Связанный контент