首页 > 解决方案 > Nginx $is_args 和 $args 重写后清除

问题描述

我试图在访问日志中写入一些信息,这些信息取决于原始请求是否具有查询参数,为此我在 $http 块中使用 $is_args。

例如,如果收到的请求是http://www.website.com/something&a=1&b=2,访问日志行应该是

.... [GET params:true] ...

但是如果请求是http://www.website.com/something,那么访问日志行应该是

.... [GET params:false] ...

我也有location一个重写的上下文:

    if ( $redirect_to_somewhere = "true") {
        return 302 $redirect_loc;
    }

我的问题是执行重写后,$args变量$is_args变空并且什么都不返回。如果重写没有发生, $args 和 $is_args 具有来自原始请求的正确值。

尽管重写,我能做些什么来获得$is_args原始请求的价值?我目前唯一可行的解​​决方案是在返回之前设置一个变量:

set $original_is_args $is_args;

然后在服务器范围之外使用它,但我看到警告不要使用在服务器{}之外以这种方式设置的变量。出于性能原因,我也不喜欢使用正则表达式匹配。

有没有可能的解决方案?

编辑:重定向后,导航到错误页面(在我的情况下这是正常的),因此原始请求中的 args 不被保留。这个问题仍然有效 - 如何在不必解析 $request_uri 的情况下仍然拥有原始 args(或 is_args)。

标签: nginxserverargs

解决方案


推荐阅读