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

时间:2018-11-17 17:14:01

标签: nginx

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

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

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

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input>

如果网址以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代理到后端,以便可以将用户导航到原始URL。为此,我使用正则表达式定义了一个位置。

/a0q

此代码段给我以下错误:

  

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

中的块

我已经经历了几个examples,并查看了多个answers,并且我相信我的配置应该可以使用。有人可以解释为什么我遇到此错误吗?

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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

有关详细信息,请参见this document