
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