NGINX 正则表达式位置的重写语法是什么?

What's the rewrite syntax for an NGINX regex location?

10.1.2.15:9002 上使用 NGINX 作为负载平衡器 运行,我需要将 http://10.1.2.15:9002/proxy.stream?opt=1 重写为 http://10.1.2.15:9002/app/proxy.stream?opt=1

以下是我的 nginx.conf 文件中的内容:

http {
  upstream app_cluster {
    server 10.1.2.23:8080;
    server 10.1.2.25:8080;
  }

  server {
    listen 9002 default_server;

    location /app/ {
      proxy_pass http://app_cluster/;
    }

    location ~ ^/proxy.stream(.*)$ {
      rewrite ^(.*)$ /app/$request_uri last;
    }
  }
}

顺便说一下,我可以用 return 401 替换 rewrite 行(例如),我可以看到使用 Chrome 开发者工具返回的 401 HTTP 状态,所以我知道正则表达式匹配。我只是无法正确重写 URI。事实上,我在 Developer Tools 中只看到状态为 406 的原始请求,所以我怀疑我的 rewrite 语法有问题。

有人看到这个配置有什么问题吗?

使用正则表达式中的匹配部分而不是 $request_uri

rewrite ^(.*)$ /app/ last;

rewrite 语句的 replacement 字符串中使用 $request_uri 是有问题的,因为它没有被规范化并且还包含查询字符串,这默认情况下,rewrite 将再次追加。

此外,您的 替换 字符串包含 //,因为您附加的 URI 已经具有前导 /.

正则表达式 location 不是必需的,因为前缀或完全匹配 location 就足够了,并且对于 nginx 更有效处理。有关更多信息,请参阅 this document

例如:

location /proxy.stream { 
    rewrite ^ /app$uri last;
}