正则表达式匹配 nginx 位置指令中的 s3 url 并代理到 amazon s3

正则表达式匹配 nginx 位置指令中的 s3 url 并代理到 amazon s3

在 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;
}

问题

  1. 我应该在位置指令中使用什么正则表达式才能使其仅匹配 amazon s3 url。
  2. 目前,它可以处理任何存储桶。我如何限制存储桶?

[更新]

我收到以下错误:

==> /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

相关内容