我开发了一个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以/urlshorting/v1
结尾,我将代理后端。
如果url以<code>/</code>开头,我将代理前端。
缩短的 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部分
我已经浏览了几个示例并查看了许多答案,我相信我的配置应该有效。有人可以解释为什么我会收到此错误吗?
如果将URI与proxy_pass
语句一起用在正则表达式place
中,则需要使用一个或多个变量构建整个URI。有关详细信息,请参阅本文档。
因此,替代方案是(1)从位置
表达式捕获URI并将其添加到proxy_pass
语句中。
location ~ ^/([A-Za-z0-9]+) {
proxy_pass http://api/urlshortener/v1/$1;
}
或者(2),使用没有URI部分的proxy_pass
,并使用重写…Rest
构造所需的URI。例如:
location ~ ^/([A-Za-z0-9]+) {
rewrite ^/([A-Za-z0-9]+) /urlshortener/v1/$1 break;
proxy_pass http://api;
}
有关详细信息,请参阅此文档。
我也犯了同样的错误,正确的答案对我的情况没有帮助。以下是我有问题的配置:
# 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/;
...
}
因此,在将其与我的其他具有类似配置的wesite进行比较而没有出现此类错误后,我发现可以通过删除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;
...
}