1、location进行路径

最常见的是通过location进行路径匹配的时候,没办法是用正则表达一起捕获这个路径和querString的。
那么我想真的URL里面的Query String进行不同的rewrite,该当如何处理呢?答案便是$arg变量。

Nginx里面$query_string 与$args相同,存储了所提交的所有$query_string;比如&p=2887&q=test

php问号传值nginx 设置装备摆设Query String args 依据前提proxypass React

如果想要在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,可以在后面加个问号:

[html] view plain copy

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:

[html] view plain copy

……

upstream other {

server 192.168.71.41:2210;

}

……

在location中加入判断:

[html] view plain copy

……

location / {

if ( $query_string ~ ^(.)c=config\b|uplog\b(.)$ ){

proxy_pass http://other;

}

……

【示例2】

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

[html] view plain copy

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】

[html] view plain copy

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

location / {

index index.php index.html index.htm;

try_files $uri $uri/ /index.php?$query_string;

if ($arg_uatserver = "test"){

proxy_pass http://xxx.com;

}

if ( $query_string ~ "selftest+$" ){

proxy_pass http://xxx.com;

}

}

在nginx中有几个关于uri的变量,包括$uri $request_uri $document_uri,下面看一下他们的差异 :

$request_uri: /getinfo.php?id=25648&web_id=20123

$uri /getinfo.php

$document_uri: /getinfo.php