
Как при использовании log_subrequest on
Nginx определить строки журнала, которые являются подзапросами?
В 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