NGINX 在没有 IF 的情况下重写参数?

NGINX rewrite args without an IF?

我想将使用查询参数类型 URL 的遗留链接重写为 URL 的新样式。

例如

  1. example.com/page?id=1 -> example.com/page/1
  2. example.com/otherpage?id=1 -> example.com/otherpage/1

目前我有以下使用 evil if 的配置。

if ($args ~* "id=(.*)") {
  set $w1 ;
  rewrite .* $scheme://$host/page/$w1? permanent;
}

注意:我使用的是CloudFront,依赖上面的主机header。

如果以上是在服务器块中,没有其他位置块 - 这是否符合 NGINX 配置中 non-evil 使用 if 的条件?另外,上面只支持/page/。使该部分适用于 otherpage 和其他页面有更好的想法吗?

我看到了其他一些讨论使用地图的想法,但我不太确定如何将它们整合在一起?我在想一些事情:

map $args_id ?? {
  default ?
  ??
}

...
server {
   ...

   ???
   
}

更新: 根据@Ivan 的回答,这是我的最终解决方案:

server {
  listen 80;
  root /usr/share/nginx/html;

  index index.html index.htm;

  # Handle legacy requests
  if ($args ~* "id=(.*)") {
    set $w1 ;
    rewrite ^ $scheme://$host$uri/$w1? permanent;
  }
}

您的 if 构造并不邪恶。你可以使用像

这样的东西
rewrite ^ $scheme://$host$uri/$w1? permanent;

对于任何页面。如果你想同时处理 example.com/page?id=1example.com/page/?id=1:

则更复杂的例子
map $uri $maybe_slash {
    ~/$      "";
    default  "/";
}
...
server {
    ...
    rewrite ^ $scheme://$host$uri$maybe_slash$w1? permanent;
    ...
}