nginx 配置$Query String

实际开发中经常有根据请求参数来路由到不同请求处理者的情况,根据POST请求参数需要些nginx插件,这里主要简单介绍下如何根据GET参数来路由。

1、location进行路径

最常见的是通过location进行路径匹配的时候,但是没办法使用正则表达一起捕获这个路径和querstring的参数。如果我们想通过URL里面的Query String进行不同的rewrite,应该如何处理呢?答案就是$arg变量。
Nginx里面$query_string 与$args相同,存储了所提交的所有$query_string;比如&p=2887&q=test
如果想要在nginx里面单独访问这些变量。可以这样
比如$p变量可以这样访问 $arg_p

2、rewrite:

需求用到rewrite 其中有一个是要把a.php?id=2重定向到b-2.html
开始简单的写为
rewrite "^/a(.*)?(.*)$"  /b-$2.html  permanent;
总是不能正确的301到b-2.html
查资料发现

rewrite只能针对请求的uri进行重写,/a.php问号后面的是请求参数,在nginx用$query_string表示,直接写这样的一条重写肯定不会正确匹配,因为rewrite参数只会匹配请求的uri,在写重写的时候需要把$query_string变量追加到重写的uri后面,为了防止uri中的参数追加到重写后的uri,可以在后面加个问号:

if ($query_string ~ "id=(.*)") {
    set  $id  $1;
    rewrite ^/a.php$ /b-$id.html? permanent;
}

【示例1】

比如我们希望访问http://192.168.71.51:6061/do1.aspx?t=1212&c=uplog当url中的参数c为config或uplog的时候(忽略大小写)我们路由到其他地方:

下面是用这样一个实例讲述一下。

首先增加一个upstream:

……
upstream other {  
    server 192.168.71.41:2210;

     }
……

在location中加入判断:

……
location / { 

       if ( $query_string ~* ^(.*)c=config\b|uplog\b(.*)$ ){
         proxy_pass                  http://other; 
       }
……

【示例2】
要求是 如果请求中的$query_string包含"q=数字",301重新定向到首页交由index.php处理。否则只是301重新定向到首页。

location ~* ^/wap/ {
#               if ( $http_user_agent ~* "(MSIE|bot|Spider|Slurp)" ) {
#               }
                if ($args ~* "p=\d+$") {
                        rewrite ^ $scheme://$host/?p=$arg_p? permanent;
                }
                #Rewrite 后面带一个?表示在重定向中使用query_tring
                rewrite ^/(.*)$ $scheme://$host/<del datetime="2012-01-24T14:18:20+00:00">?</del> permanent;
 }

注:关于rewrite后面的问号,其作用是去除后面的qrerystring,不加?的话,就是这样的比如原来的query_string是p=2887,不加问号的话 是重新定向到
http://ihipop.info/?2887&p=2887 多了一个&p=2887这样产生的 URI 不是很美观。

【示例3】

    location / {
        if ( $query_string ~* "p=\d+$" ) {
               proxy_pass                  http://www.ifeng.com;
        }

        proxy_pass                  http://www.baidu.com;

    }

通过如上配置,当访问nginx时,如果后面带有p=数字的参数(http://10.153.140.42/?p=1),就会跳转到ifeng,否则跳转到baidu。

【示例4】

url路径中uid参数的值如果以a结尾,访问百度;如果以b结尾访问凤凰。

location / {
        root    html;
        index   index.html index.htm index.php;
        proxy_redirect      off;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header    X-Real-IP $remote_addr;
        proxy_set_header    Host $http_host;
        proxy_http_version  1.1;
        proxy_set_header    Connection "";

        if ( $query_string ~* "uid=(.*a$)" ) {
                proxy_pass      http://www.baidu.com;
        }
        if ( $query_string ~* "uid=(.*b$)" ) {
                proxy_pass      https://github.com;
        }
}

如果连接后面会有多个参数,这种配置的匹配方式是错误的,正确的做法参照:https://blog.csdn.net/liuxiao723846/article/details/83147792

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赶路人儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值