
Nginx에서 사용할 때 log_subrequest on
하위 요청인 로그 줄을 어떻게 식별할 수 있나요?
Apache에는 변수가 있지만 IS_SUBREQ
Nginx에는 이에 상응하는 변수가 없는 것 같습니다.
모듈 을 사용하고 slice
있으며 다음과 같이 로그를 처리하고 있습니다.고라니그리고 기본 요청의 로그 줄과 하위 요청의 로그 줄을 분리해야 합니다.
감사해요
답변1
TL;DR
방법이 있지만 약간의 프로그래밍이 필요하지 않습니다.
- 쿼리 문자열 부분을 제거하십시오.
$request_uri
- URI - 결과 이스케이프 해제
$query_string
있는 경우 를 추가하세요 .$query_string
에 추가$uri
- 강화된 것과
$uri
수정된 것을 비교해 보세요$request_uri
. 서로 같지 않으면 방금 하위 요청을 발견한 것입니다.
긴 답변
현재는 간단한 방법으로 사용자 상호작용 요청과 하위 요청을 구별할 수 있는 방법이 없는 것 같습니다.변하기 쉬운아파치처럼요. $is_subreq
단순히 다음과 같은 것사용할 수 없습니다. (nginx 개발팀, 누구든지?)
현재 저는 nginx용 htaccess 플러그인을 프로그래밍하고 있는데, 현재 요청이 원본인지 확인하는 방법을 찾아야 했습니다. 이는 다음을 통해 달성할 수 있습니다.비교 $uri
하다$request_uri
, 서로 다를 경우 요청은 후속 조치입니다.
하지만조심하세요, 변수를 대담하게 비교하면 실패할 것입니다.
$uri
해당 변수가 부족 $query_string
하고 URL로 디코딩되었지만 $request_uri
쿼리 문자열이 첨부된 상태로 그대로 남아 있습니다(아직 인코딩됨).
다음은 실제 프로젝트(Lua의 htaccess 구현)에서 발췌한 코드입니다. 여기에서 제가 어떻게 수행했는지 확인할 수 있습니다.
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