在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