我使用一个url用于不同的目的:
编辑:添加基于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并返回一个位置标题