我需要使用arg键来重写nginx的匹配位置

我使用一个url用于不同的目的:

  1. / path / items:返回一个项目列表
  2. / path / items?id = XXX:redirect到URL / path / items / item?id = XXX

编辑:添加基于Tero的input的解决scheme

我在我的nginx conf文件中试过这个规则:

location ~ / { rewrite '^/path/items\?id=([0-9]*)$' /items/item?id=$1? break; } 

当我访问页面/path/项目?id = XXX,我得到以下日志:

2016/08/25 14:08:53 [notice] 22903#0: 1“^ / path / items \?id =([0-9] )$”不匹配“/ path / items”,客户端:XXX ,server:local.xxx.ins,请求:“GET / path / items?id = 32442305 HTTP / 1.1”,主机:“local.xxx.ins”

我从那个日志里明白,在做比赛之前,nginx会删除这些参数。 但我无法find如何获得包括参数在内的比赛。

我想出了一个真正接近Tero的解决scheme。

 location ~ /(path1|path2|path3) { if ($arg_id) { rewrite ^ $uri/item break; } proxy_pass http://local.xxx.ins:8080; } 

您不能在rewrite指令中处理查询string。 你只能在那里处理URI。

你可以试试这个configuration:

 location /path/items { if ($arg_item) { rewrite ^ /items/item break; } try_files $uri $uri/ =404; } 

location /path/items仅限于具有/path/items前缀的URI。 我们testing一个查询参数item是否在HTTP请求中定义。 如果是,我们重写URI。 否则,我们只是尝试客户端提供的URI。

您可能需要修改try_files指令,具体取决于项目列表的制作方式。 如果在server级别没有定义,您可能还需要root指令。

一种可能的方法是通过CGI或PHP脚本处理/ location(请参阅这里的nginx和php ),并让他们检查QUERY_STRING并返回一个位置标题