TL;DR

TL;DR

Nginx에서 사용할 때 log_subrequest on하위 요청인 로그 줄을 어떻게 식별할 수 있나요?

Apache에는 변수가 있지만 IS_SUBREQNginx에는 이에 상응하는 변수가 없는 것 같습니다.

모듈 을 사용하고 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

관련 정보