在 nginx 位置指令中,如何匹配 s3 URL。
例如错误的网址是:
http://example.com/https://s3.amazonaws.com/mybucket/logo.jpg?1404251306
从日志中,我可以看到 nginx 可以为来自该 url 的请求提供服务并返回 404。
xx.xx.xx.xx - - [15/Aug/2014:12:38:04 +0000] "GET /https://s3.amazonaws.com/mybucket/logo.jpg HTTP/1.1" 404 151 "-" "Mo
有了这个,我想匹配这个 url,将请求代理到 s3 并返回logo.jpg
。我想出了这样的东西:
location ~* ^/https/(.*) {
set $s3_host 's3.amazonaws.com';
set $s3_bucket 'mybucket';
proxy_set_header Host $s3_host;
proxy_set_header Authorization '';
proxy_hide_header x-amz-id-2;
proxy_hide_header x-amz-request-id;
proxy_hide_header Set-Cookie;
proxy_ignore_headers "Set-Cookie";
proxy_buffering off;
proxy_intercept_errors on;
resolver 8.8.8.8 valid=300s;
resolver_timeout 10s;
proxy_pass http://$1;
}
问题:
- 我应该在位置指令中使用什么正则表达式才能使其仅匹配 amazon s3 url。
- 目前,它可以处理任何存储桶。我如何限制存储桶?
[更新]
我收到以下错误:
==> /var/log/nginx/error.log <==
2014/08/15 13:53:08 [error] 1579#0: *1 invalid port in upstream ":/s3.amazonaws.com/mybucket/logo.jpg", client: xx.xx.xx.xx, server: localhost, request: "GET /https://s3.amazonaws.com//mybucket/logo.jpg HTTP/1.1", host: "54.164.92.206"
答案1
编辑:(1)抱歉,这里有些拼写错误(2)我调整了正则表达式,使其与字符串前的一个或多个斜线匹配,mybucket
就像上面的日志一样。
嗯,也许你的意思是这样的
location ~* ^/https://s3\.amazonaws\.com/+mybucket(.*) {
...
proxy_pass http://s3.amazonaws.com/mybucket$1;
}
答案2
我遇到这个错误,是因为我Host
错误地设置了标题。
这是最终有效的配置:
set $s3_bucket 's3-us-west-1.amazonaws.com';
...
proxy_set_header Host $s3_bucket;
请注意,主机头确实不是包括 http/https。这应该包含在以下proxy_pass
行中
proxy_pass http://$s3_bucket/whatever