【问题标题】:Making nginx check parameter in url在url中制作nginx检查参数
【发布时间】:2014-07-22 04:56:02
【问题描述】:

我想检查一个参数是否存在于 nginx 的 url 中,然后重写。我该怎么做?

例如,如果 url 是 http://website.com/?mobile,则将用户重定向到 http://m.website.com

【问题讨论】:

  • 如果可以的话,尽量使用一些值。检查参数是否具有某些值很简单if ($arg_mobile)。检查是否有空参数mobile 不是那么清晰且容易出错。
  • @AlexeyTen 你能用一个例子把它作为答案发布吗...我以前从未使用过参数

标签: nginx parameters arguments


【解决方案1】:

你最好使用http://example.com/?mobile=1(带有值的参数)。在这种情况下,检查很简单:

if ($arg_mobile) {
    return 302 http://m.example.com/;
}

检查参数是否存在通常使用if ($args ~ mobile) 之类的正则表达式完成,但它很容易出错,因为它会在任何地方匹配mobile,例如http://example.com/?tag=automobile.

【讨论】:

  • 我需要做的就是将上面的代码添加到我的 nginx 配置文件中。nginx 是否已经知道$arg_mobile 将检查?mobile-1
  • (=) — 等号,而不是 (-) 连字符。它将检查mobile=pretty-anything 除了0(零)和空参数。
  • 我得到了 nginx: [emerg] unknown directive "if($arg_querystringkey)" 版本 nginx/1.12.2。这不再支持了吗?
  • @raksja 尝试在“if”之后添加空格
  • 感谢@AlexeyTen,它成功了。我在这里有一个关于动态 proxy_pass 变量的后续问题,你能看看nginx dynamic proxy pass variable
【解决方案2】:

如果你知道你只有1个参数{{variable}}可以切换,你可以像这样检测是否存在

if ($request_uri ~ '\?{{variable}}') {
    ...
}

例如

if ($request_uri ~ '\?mobile') {
    return 302 https://m.example.com;
}

另外我建议考虑使用这个重定向

http://{{domain}}.{{tld}}/mobile -> http://m.{{domain}}.{{tld}}

location ~ '/mobile'
    return 301 'https://m.{{domain}}.{{tld}}';
}

例如

location ~ '/mobile'
    return 301 'https://m.example.com';
}

【讨论】:

    【解决方案3】:

    你可以试试这个来匹配你的参数

    if ($args ~ '\bmobile[=&]?' )
    {
        return 302 http://m.example.com/;
    }
    

    因为这将匹配 $args 中任何位置的“mobile”,无论有无价值。

    【讨论】:

      猜你喜欢
      • 2019-03-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 2011-07-18
      • 2016-03-31
      • 1970-01-01
      • 2019-02-07
      • 1970-01-01
      相关资源
      最近更新 更多