正则expression式匹配Nginx的位置指令和代理s3的URL到亚马逊S3

nginx位置指令中,我如何匹配s3的url。

例如,错误的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. 我应该在位置指令中使用什么正则expression式,所以它只匹配亚马逊S3url。
  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)对不起,这里有一些错字(2)我调整正则expression式,所以它匹配一个或多个斜杠之前像上面的日志stringmybucket

好吧,也许你的意思是这样的

 location ~* ^/https://s3\.amazonaws\.com/+mybucket(.*) { ... proxy_pass http://s3.amazonaws.com/mybucket$1; } 

我碰到这个错误,这是因为我设置了Host头错误。

这是最后工作的configuration:

 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