【问题标题】:Why does $args or $query_string not include the query parameters after &?为什么 $args 或 $query_string 不包含 & 后面的查询参数?
【发布时间】:2018-03-12 23:32:54
【问题描述】:

我正在尝试设置一个 nginx 重写规则来修改带有查询请求的 URL。

例如:

www.abc.com/pathA/pathB/script.pl?paraA=10&paraB=20

应该改写为:

www.abc.com/pathA/pathB/script.pl.1020

我尝试使用变量$args$query_string(基于nginx文档它们是相同的)来检查URL是否有查询请求。但是我发现$args(或$query_string)只有&之前的内容。

在我的示例中,它表示$args = paraA=10。在& 之后无法获取参数内容。我通过设置为调试级别的 nginx 错误日志确定这一点。

知道为什么我无法在变量$args$query_string 中获取& 之后的查询参数吗?

【问题讨论】:

标签: url nginx url-rewriting query-string


【解决方案1】:

你需要使用$arg_<argname>

www.abc.com/pathA/pathB/script.pl?paraA=10&paraB=20 将被重写为:www.abc.com/pathA/pathB/script.pl.1020

以下是执行此类操作的示例配置

location /pathA/pathB/script.pl {
    set $need_redirect "";
    if ($arg_paraA) {
       set $need_redirect "A";
    }

    if ($arg_paraB) {
       set $need_redirect "B$need_redirect";
    }

    if ($need_redirect = "BA") {
       rewrite ^(.*)$ $1.$arg_paraA$arg_paraB;
    }
}

【讨论】:

  • 谢谢。我之前确实尝试过使用 $arg_ ,它也对我不起作用。在我的情况下,似乎 $arg_ 是空白的。这很奇怪。
  • 哪个版本的 nginx?尝试使用最新版本,看看是否有帮助
  • 是的,那只会发送 paraA 而不会发送 paraB。所以你需要确保为 url 加上引号
  • 我发现了问题。我使用 curl 发送请求,但我忘记在我的 url 中使用双引号。例如。 : curl www.abc.com/pathA/pathB/script.pl?paraA=10&paraB=20 如果没有双引号,"&" 将结束 cmd 并且 "&paraB=20" 从未发送过。因此,Nginx 永远不会得到完整的请求。现在我改为: curl "www.abc.com/pathA/pathB/script.pl?paraA=10&paraB=20" 问题已解决。非常感谢您的帮助。
  • 但是我还有一个问题,现在我将整个重写逻辑放在了位置之外。最好把它放在位置作为你的例子。但是我重写后发现,文件位置不会是我想要的。就我而言,我的 conf 中有另一个位置块: location / { root /home/user_name/script; }
【解决方案2】:

问题不是由nginx配置文件引起的。这是由于我在使用 curl 发送请求时忘记了双引号引起的。例如。: 卷曲“www.abc.com/pathA/pathB/script.pl?paraA=10&paraB=20” 没有双引号,“&paraB=20”实际上永远不会被发送。

【讨论】:

  • 谢谢,它帮助了我!
猜你喜欢
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
  • 2014-08-27
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多