在url中制作nginx检查参数

Posted

技术标签:

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

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

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

【问题讨论】:

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

【讨论】:

以上是关于在url中制作nginx检查参数的主要内容,如果未能解决你的问题,请参考以下文章

nginx服务器中若php项目的url带参数则报错

如何在nginx中使用参数重定向url

从 URL 下载嵌套 JSON 并制作 Observable Object SwiftUI,错误:“在调用中缺少参数 'from' 的参数”

nginx/redis 和处理 url 中的跟踪参数

nginx利用location匹配url中?号后的参数

nginx根据url中的参数进行转发