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

时间:2018-05-29 21:31:18

标签: nginx nginx-location

使用NGINX作为在10.1.2.15:9002上运行的负载均衡器,我需要将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;
    }
  }
}

顺便说一句,我可以将rewrite行替换为return 401(例如),我可以看到使用Chrome开发者工具返回的401 HTTP状态,因此我知道正则表达式是匹配的。我只是无法正确地重写URI。实际上,我只在开发人员工具中看到原始请求的状态为406,因此我怀疑我的rewrite语法出现了问题。

有没有人看到此配置有什么问题?

2 个答案:

答案 0 :(得分:1)

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

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

正则表达式 /不是必需的,因为前缀或完全匹配location就足够了,location处理效率更高。有关详情,请参阅this document

例如:

nginx

答案 1 :(得分:0)

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

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