要約

要約

Nginx で使用する場合log_subrequest on、サブリクエストであるログ行をどのように識別できますか?

Apache には変数がありますIS_SUBREQが、Nginx には同等のものはないようです。

私はsliceモジュールを使用してログを処理していますエルクメインリクエストのログ行とサブリクエストのログ行を分離する必要があります。

ありがとう

答え1

要約

方法はありますが、少しプログラミングが必要になります。

  • クエリ文字列部分を削除する$request_uri
  • 結果をURIエスケープ解除する
  • $query_stringあれば追加してください
  • $query_stringに追加する$uri
  • $uri拡張されたと変更された を比較し$request_uri、それらが等しくない場合は、サブリクエストが検出されたことになります。

長い回答

現時点では、ユーザーによるリクエストとサブリクエストを単純な方法で区別する方法はないようです。変数Apacheのように。$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

関連情報