我开发了一个URL缩短web应用程序。
它由两个独立的码头容器组成:一个包含后端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以/开头,我将代理到前端。
缩短的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“不能在正则表达式或命名位置内,或在"if”语句中,或在/etc/nginx/nginx.conf:36中的"limit_except“块中具有URI部分。
发布于 2018-11-17 19:48:19
如果在正则表达式proxy_pass中使用带有location语句的URI,则需要使用一个或多个变量构建整个URI。详情请参见本文件。
因此,替代方法是(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;
}详情请参见本文件。
发布于 2022-06-10 05:36:07
我也犯了同样的错误,正确的答案对我的处境没有帮助。以下是我有问题的吐露:
# 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来简单地解决:
# 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;
...
}https://stackoverflow.com/questions/53353572
复制相似问题