实际开发中经常有根据请求参数来路由到不同请求处理者的情况,根据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。
新闻热点
疑难解答