gpt4 book ai didi

nginx - "proxy_pass"URI 部分不能位于正则表达式给出的位置

转载 作者:行者123 更新时间:2023-12-04 23:12:37 27 4
gpt4 key购买 nike

我开发了一个 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/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" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block in /etc/nginx/nginx.conf:36



我经历了几个 examples并查看了许多 answers我相信我的配置应该可以工作。有人可以解释为什么我会收到这个错误吗?

最佳答案

如果您使用带有 proxy_pass 的 URI正则表达式中的语句 location ,您需要使用一个或多个变量来构建整个 URI。见 this document详情。

所以替代方案是 (1),从 location 捕获 URI表达式并将其添加到 proxy_pass陈述。例如:

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

或 (2),使用 proxy_pass没有 URI 部分,并使用 rewrite...break 构造所需的 URI .例如:
location ~ ^/([A-Za-z0-9]+) {
rewrite ^/([A-Za-z0-9]+) /urlshortener/v1/$1 break;
proxy_pass http://api;
}

this document详情。

关于nginx - "proxy_pass"URI 部分不能位于正则表达式给出的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53353572/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com