总结

总结

在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

相关内容