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

时间:2015-09-21 03:45:46

标签: nginx

我正在使用nginx变量$arg_来获取url args。

但我发现网址是否像“http://foobar.com/search?field-keywords=foobar”,$arg_field_keywords$arg_field-keywords不起作用。

我可以使用field-keywords获取$arg_吗?

提前致谢。

4 个答案:

答案 0 :(得分:1)

我找到article,这有一个小技巧来处理你的问题。

TLDR:

  

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

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

诀窍是map不能完全解析其参数。语法是:map A X {默认Y; },用:

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

我想它也可能适用于$args_

答案 1 :(得分:0)

使用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;

答案 2 :(得分:0)

虽然lua可以工作,但是我们有没有lua支持的nginx。谷歌搜索,我从上游开发人员那里找到了以下答案

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

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

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

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

答案 3 :(得分:0)

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

例如:

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

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