Alterar URL para proxy_pass baseado no cabeçalho

1

Há algumas perguntas semelhantes, mas elas não resolvem meu problema.

Eu uso o nginx como proxy para um cdn. Se o navegador estiver aceitando webp como formato de imagem, ele deverá ser exibido, caso contrário, o original.

Assume-se que sempre há myfilename.jpg e myfilename.jpg.webp (eu tenho um fallback que gera as imagens se elas não existirem).

Eu faço este mapeamento:

map $http_accept $webp_suffix {
    default   "";
    "~*webp"  ".webp";
}

E esta é a configuração do nginx:

server {
    listen 80;
    server_name images.cdn.de;

    error_page 403 404 = /-;

    location /- {
        proxy_pass         http://web:8808;
        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-Proto    $scheme;
        proxy_set_header   X-Original-URI       $original_uri;
        proxy_read_timeout 600;
        internal;
    }


    location / {

      set $original_uri $uri$is_args$args;

      proxy_http_version     1.1;
      proxy_set_header       Host 's3.eu-central-1.amazonaws.com';
      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;

      expires 1y;

      proxy_pass https://s3.eu-central-1.amazonaws.com/bucket/media/public/images/;
    }
  }

A ideia é que, se uma imagem estiver lá, ela será enviada diretamente do s3. Se não estiver lá (existem diretivas de recorte dentro do nome do arquivo) ele é gerado pelo serviço web:8808 on the fly e carregado para as chamadas subsequentes para s3.

Esse trabalho está bem.

Gostaria de saber como posso adicionar o $webp_suffix (que tem como padrão uma string vazia) à url passada para o proxy s3.

    
por shredding 08.09.2016 / 09:47

1 resposta

1

Você precisa reescrever o URI se ele terminar em .jpg . Você poderia simplesmente adicionar uma instrução rewrite ... break ao bloco location / .

Como você tem um URI anexado à diretiva proxy_pass , o rewrite ... break fará com que o alias de URI seja ignorado. Consulte este documento para obter detalhes.

Uma solução limpa pode ser sempre reescrever o URI, em vez de confiar no efeito de aliasing proxy_pass :

location / {
    rewrite \.jpg$ /neuraum/media/public/images$uri$webp_suffix break;
    rewrite ^ /neuraum/media/public/images$uri break;
    ...
    proxy_pass https://s3.eu-central-1.amazonaws.com;
}
    
por 08.09.2016 / 09:58