我将一个 URL 用于不同的目的:
- /path/items :返回项目列表
- /path/items?id=XXX :重定向到 URL/路径/项目/项目?id=XXX
编辑:根据 Tero 的输入添加解决方案
我已经在我的 nginx conf 文件中尝试过该规则:
location ~ / {
rewrite '^/path/items\?id=([0-9]*)$' /items/item?id=$1? break;
}
当我访问页面/path/items?id=XXX时,我得到以下日志:
2016/08/25 14:08:53 [通知] 22903#0:1 "^/path/items\?id=([0-9])$" 与 "/path/items" 不匹配,客户端:XXX,服务器:local.xxx.ins,请求:“GET /path/items?id=32442305 HTTP/1.1”,主机:“local.xxx.ins”
我从该日志中了解到 nginx 在进行匹配之前删除了参数。但我无法找到如何获得包含参数的匹配。
我想到了一个与 Tero 的解决方案非常接近的解决方案。
location ~ /(path1|path2|path3) {
if ($arg_id) {
rewrite ^ $uri/item break;
}
proxy_pass http://local.xxx.ins:8080;
}
答案1
您无法处理指令内的查询字符串rewrite
。您只能在那里处理 URI。
您可以尝试这样的配置:
location /path/items {
if ($arg_item) {
rewrite ^ /items/item break;
}
try_files $uri $uri/ =404;
}
location /path/items
将此行为仅限制于具有前缀的 URI 。/path/items
我们测试 HTTP 请求中是否定义了查询参数item
。如果是,我们将重写 URI。否则,我们只会尝试客户端提供的 URI。
try_files
您可能需要根据项目列表的制作方式修改指令。root
如果级别中未定义指令,您可能还需要一个指令server
。
答案2
一种可能的方法是让 /location 由 CGI 或 PHP 脚本处理(请参阅此处nginx 和 php)并让他们检查QUERY_STRING并发回一个地点标题