regex para combinar s3 urls na diretiva de localização nginx e proxy para amazon s3

1

Na diretiva de localização nginx, como faço para corresponder s3 URLs?

por exemplo, o URL errado é:

http://example.com/https://s3.amazonaws.com/mybucket/logo.jpg?1404251306

do Logs, posso ver o nginx capaz de atender a solicitação deste URL & retorna um 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

com isto, quero corresponder este URL, proxy o pedido para s3 & Código de retorno%. Eu inventei algo assim:

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

Perguntas :

  1. Que regex devo usar na diretiva location para que corresponda à amazon s3 apenas para urls.
  2. Atualmente, lida com qualquer intervalo. Como faço para restringir     o balde também?

[Atualizar]

Eu recebo o seguinte erro:

==> /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"
    
por CuriousMind 15.08.2014 / 15:11

2 respostas

3

Edit: (1) Desculpe, algum erro de digitação aqui (2) Eu ajustei a regex para que ela correspondesse a uma ou mais barras antes da string mybucket gostar do seu log acima.

Bem, talvez você queira dizer algo assim

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

Eu acertei esse erro e foi porque eu estava definindo o Host do cabeçalho errado.

Aqui está a configuração que acabou funcionando:

set $s3_bucket        's3-us-west-1.amazonaws.com';
...
proxy_set_header       Host $s3_bucket;

Observe que o cabeçalho do host não inclui http / https. Isso deve ser incluído na linha proxy_pass

      proxy_pass             http://$s3_bucket/whatever
    
por 16.08.2015 / 08:33