首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"proxy_pass“不能在正则表达式给定的位置上有URI部分

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

Stack Overflow用户
提问于 2018-11-17 17:14:00
回答 2查看 49.4K关注 0票数 47

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

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

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

代码语言:javascript
复制
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以/开头,我将代理到前端。

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

代码语言:javascript
复制
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”语句中,或在/etc/nginx/nginx.conf:36中的"limit_except“块中具有URI部分。

我已经看过几个示例并复习了许多答案,我相信我所拥有的配置应该可以工作。有人能解释一下为什么我会犯这个错误吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-17 19:48:19

如果在正则表达式proxy_pass中使用带有location语句的URI,则需要使用一个或多个变量构建整个URI。详情请参见本文件

因此,替代方法是(1),从location表达式中捕获URI并将其添加到proxy_pass语句中。例如:

代码语言:javascript
复制
location ~ ^/([A-Za-z0-9]+) {
    proxy_pass http://api/urlshortener/v1/$1;
}

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

代码语言:javascript
复制
location ~ ^/([A-Za-z0-9]+) {
    rewrite ^/([A-Za-z0-9]+) /urlshortener/v1/$1 break; 
    proxy_pass http://api;
}

详情请参见本文件

票数 72
EN

Stack Overflow用户

发布于 2022-06-10 05:36:07

我也犯了同样的错误,正确的答案对我的处境没有帮助。以下是我有问题的吐露:

代码语言:javascript
复制
# proxying wordpress static files
location ~* (((product|blog|product-category)\/.*)|(\.(ogg|ogv|svg|svgz|eot|otf|woff|woff2|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)))$ {
    proxy_pass https://mainhost.cdkeysell.ir/;
    ...
}

因此,在将其与具有类似信任的其他/进行比较之后,我发现这可以通过删除proxy_pass配置末尾的后一个proxy_pass来简单地解决:

代码语言:javascript
复制
# proxying wordpress static files
location ~* (((product|blog|product-category)\/.*)|(\.(ogg|ogv|svg|svgz|eot|otf|woff|woff2|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)))$ {
    # proxy_pass https://mainhost.cdkeysell.ir/; ==> final `/` caused error
    proxy_pass https://mainhost.cdkeysell.ir;
    ...
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53353572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档