nginx:如何获取包含破折号的url参数?

问题描述 投票:0回答:4

我正在使用 nginx 变量

$arg_
来获取 URL 参数。

我发现如果 URL 类似于“http://foobar.com/search?field-keywords=foobar”、

$arg_field_keywords
$arg_field-keywords
则不起作用。

我可以用

field-keywords
获得
$arg_
吗?

nginx
4个回答
3
投票

虽然 lua 可以工作,但我们的 nginx 不支持 lua。谷歌搜索我发现了上游开发人员的以下答案

虽然这目前可能有效,但我不建议依赖于此 - 因为这是一个错误而不是期望的行为。 这将停止 只要添加对多个变量的支持就可以工作 地图。

相反,我建议使用基于正则表达式的 $args 解析 正如弗朗西斯建议的变量。 这可以通过地图轻松完成, 像这样:

map $args $param_with_dash {
    "~(^|&)param-name=(?<temp>[^&]+)"  $temp;
}

参考:https://marc.info/?l=nginx&m=141589036701879&w=2


1
投票

我找到了文章,其中有一个小技巧可以解决你的问题。

总长:

您可以使用映射模块重新映射具有复杂名称的变量,如下所示:

map $is_args $http_x_origin {
  default $http_x-origin;
}

诀窍在于,map 没有完全解析它的参数。语法为:map A X { default Y; },与:

  • 任何变量,最好是不会触发太多内部处理的变量(因为 nginx 配置是声明性的,使用变量对其进行评估)。我使用 $is_args 因为计算起来很便宜。
  • X 是您将要创建的新变量的名称,即地图目标。
  • Y 是您要访问的变量的名称。此时,它可以包含破折号,因为地图会进行自己的解析。

我想它也可能与

$args_
一起使用。


1
投票

使用 openresty/1.11.2.4,接受的答案中提到的

map
方法对我不起作用。但由于 openresty 附带了预编译的 Lua 模块,我可以使用以下代码来完成此操作:

set $dataArg '';
set_by_lua_block $dataArg { return ngx.req.get_uri_args()["data-arg"] }
proxy_cache_key $scheme$proxy_host$uri$is_args$dataArg;

0
投票

使用map指令获取值参数a-b

例如:

map $args $arg_a_b {
     ~*&?a-b=([^&]*) $1;
     default         "";
}

匹配 a-b 不区分大小写,并将值获取到 $arg_a_b,如果未设置为 null

© www.soinside.com 2019 - 2024. All rights reserved.