“proxy_pass”不能在正则表达式给出的位置包含 URI 部分

2023-12-27

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

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

这两个容器链接到一个 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;
        }
    }

}

如果 url 结尾为/urlshortening/v1,我正在代理到后端。

如果 url 开头为/,我正在代理到前端。

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

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

这段代码给我带来了以下错误:

2018/11/17 16:47:03 [emerg] 1#1:“proxy_pass”不能在正则表达式给出的位置、命名位置、“if”语句或“limit_except”块内包含 URI 部分/etc/nginx/nginx.conf:36

我经历过好几个examples https://www.thegeekstuff.com/2017/05/nginx-location-examples/并审查了一些answers https://serverfault.com/a/693951我相信我的配置应该可以工作。有人可以解释一下为什么我会收到此错误吗?


如果您使用带有proxy_pass内的语句正则表达式 location,您需要使用一个或多个变量构建整个 URI。看这个文件 http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass了解详情。

因此,替代方案是 (1),从location表达式并将其添加到proxy_pass陈述。例如:

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

或者(2),使用proxy_pass没有 URI 部分,并使用rewrite...break。例如:

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

See 这个文件 http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite了解详情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“proxy_pass”不能在正则表达式给出的位置包含 URI 部分 的相关文章

随机推荐