【问题标题】:reroute nginx request url重新路由 nginx 请求 url
【发布时间】:2017-02-21 12:47:43
【问题描述】:

我有一个反向 nginx 代理,我想路由所有进来的请求:

http://dns.com/content/xyz <—to—> http://dns.com/content/1.0/xyz

我有一个上游:

upstream backend_api.content.com {
        server localhost:8080 max_fails=5 fail_timeout=30;
        keepalive 100;
  }

和位置:

#Content Service
location ~* ^/content/?(.*) {
     set $proxy_pass "http://backend_api.content.com";
     rewrite ^/content/1.0(/.*)$ /content/1.0$1 break;
     proxy_pass $proxy_pass
     proxy_http_version 1.1;
     proxy_set_header Connection "";
     proxy_set_header  X-Real-IP  $remote_addr;
     proxy_set_header  Host "api.stg.xxx.com";
     proxy_set_header X-3scale-proxy-secret-token $secret_token;
     proxy_set_header Original-Host $http_host;
     proxy_set_header Authorization $outbound_auth_header;
     proxy_set_header Original-Uri $scheme://$http_host$uri;
     post_action /out_of_band_oauth_authrep_action;
    }

但似乎http://dns/content/xyz 的任何东西都失败了,只有当我给http://dns/content/1.0/xyz 时它才会起作用。

【问题讨论】:

    标签: nginx dns reverse-proxy nginx-location


    【解决方案1】:

    您似乎捕获了 location ~* ^/content/?(.*) 语句中的部分 URI,但不对其进行任何操作。

    您还有一个 rewrite ^/content/1.0(/.*)$ /content/1.0$1 break; 语句什么都不做,它只是写回相同的 URI。

    一个快速而肮脏的解决方案可能是使用两个 rewrite 语句,如下所示:

    rewrite ^/content/1.0(/.*)$ /content/1.0$1 break;
    rewrite ^/content(/.*)$ /content/1.0$1 break;
    

    这意味着任何与第一次(非)重写不匹配的内容都将由第二次处理,并插入一个/1.0。

    个人不喜欢,宁愿用两个定位块:

    location /content/1.0 {
        set $proxy_pass "http://backend_api.content.com";
        proxy_pass $proxy_pass;
        proxy_http_version 1.1;
        proxy_set_header ...
        ...
    }
    location /content {
        rewrite ^/content(/.*)$ /content/1.0$1 last;
    }
    

    但请检查您的其他 location 块的评估顺序。请注意,前缀位置块和正则表达式位置块具有不同的评估规则。详情请见this document。

    【讨论】:

      猜你喜欢
      • 2020-04-16
      • 1970-01-01
      • 2018-08-07
      • 1970-01-01
      • 1970-01-01
      • 2018-09-09
      • 2012-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多