代码之家  ›  专栏  ›  技术社区  ›  W.K.S

“proxy_pass”在正则表达式给定的位置不能有URI部分

  •  1
  • W.K.S  · 技术社区  · 7 年前

    我开发了一个URL缩短web应用程序。

    它由两个独立的docker容器组成:一个包含后端RESTAPI,另一个包含前端静态网站。

    这两个容器链接到一个nginx容器。 此nginx容器的配置如下:

    worker_processes 1;
    
    events { worker_connections 1024; }
    
    http {
        upstream api {
            server short-url:8080;
        }
    
        upstream frontend {
            server short-url-frontend:8081;
        }
    
        gzip on;
        gzip_vary on;
        gzip_min_length 860;
        gzip_proxied expired no-cache no-store private auth;
        gzip_types text/plain text/css text/xml application/javascript application/x-javascript application/xml;
        gzip_disable "MSIE [1-6]\.";
    
        server {
            listen 80;
            root    /user/share/nginx/html;
    
            location /urlshortener/v1 {
                proxy_pass         http://api/urlshortener/v1;
                proxy_redirect     off;
                proxy_set_header   Host $host;
                proxy_set_header   X-Real-IP $remote_addr;
                proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header   X-Forwarded-Host $server_name;
            }
    
            location ~ ^/([A-Za-z0-9]+) {
                rewrite ^/([A-Za-z0-9]+) /$1
                proxy_pass         http://api/urlshortener/v1;
            }
    
            location / {
                proxy_pass          http://frontend;
                proxy_set_header    Host              $host;
                proxy_set_header    X-Real-IP         $remote_addr;
                proxy_set_header    X-Forwarded-for   $remote_addr;
            }
        }
    
    }
    

    /urlshortening/v1 ,我将代理到后端。

    /

    /3xTy /a0q 需要代理到后端,以便用户可以导航到原始url。为了做到这一点,我用正则表达式定义了一个位置。

    location ~ ^/([A-Za-z0-9]+) {
        rewrite ^/([A-Za-z0-9]+) /$1
       proxy_pass         http://api/urlshortener/v1;
    }
    

    我经历了好几次 examples 并审阅了一些 answers

    1 回复  |  直到 7 年前
        1
  •  45
  •   Richard Smith    7 年前

    如果将URI与 proxy_pass 内部声明 location ,您需要使用一个或多个变量构建整个URI。看见 this document 详情请参阅。

    位置 代理通行证 陈述例如:

    location ~ ^/([A-Za-z0-9]+) {
        proxy_pass http://api/urlshortener/v1/$1;
    }
    

    没有URI部分,并使用 rewrite...break

    location ~ ^/([A-Za-z0-9]+) {
        rewrite ^/([A-Za-z0-9]+) /urlshortener/v1/$1 break; 
        proxy_pass http://api;
    }
    

    this document 详情请参阅。