Servindo condicionalmente imagens de alta resolução e WebP com nginx

2

Não tenho certeza se estou tentando realizar o impossível, mas estou querendo configurar o Nginx para exibir arquivos ".webp" em navegadores que suportam o formato de arquivo e exibem arquivos de fallback (ou seja, pngs, jpgs etc. ) para navegadores que ainda não suportam o formato WebP. Também gostaria que o Nginx fizesse isso tudo enquanto verificava o suporte à retina e atendia as versões original ou com tamanho @ 2x dessas fotos.

Exemplo de processo para uma imagem chamada 'sample-photo' no diretório /assets/img/ :

  • Verifique se o navegador é compatível com WebP E, se for um dispositivo de alta resolução, forneça: "assets/img/[email protected]"
  • O dispositivo pode não ser de alta resolução, então, em vez disso, veicule: "assets / img / sample-photo.webp"
  • Talvez o WebP não seja compatível, mas o dispositivo é de alta resolução, portanto, ative: "assets/img/[email protected]"
  • O navegador não é compatível com WebP e o dispositivo NÃO é de alta resolução. Ative: "assets / img / sample-photo.png"

Eu mesmo fiz uma tentativa, mas não estou tendo muita sorte. Eu encontrei dois posts impressionantes que me ajudaram a começar na direção certa. Abaixo está o meu código. Realmente apreciaria qualquer percepção e ajuda sobre isso. Meu primeiro pensamento é que algo está acontecendo na última declaração try_files . Muito obrigado!

  1. Condicionalmente servindo imagens de alta resolução
  2. Sirva arquivos com o nginx condicionalmente

Esse código está no cabeçalho HTML do meu documento. Verifica o suporte de alta resolução e define um cookie:

<!-- Set the 'device-pixel-ratio' cookie with Javascript if hi-res is supported -->
<script type="text/javascript">
    if (!document.cookie.match(/\bdevice-pixel-ratio=/)) {
        document.cookie = 'device-pixel-ratio='
            + (window.devicePixelRatio > 1 ? '2' : '1') + '; path=/';
    }
</script>

<!-- A CSS-only fallback of setting the 'device-pixel-ratio' cookie just in case browsers have Javascript disabled -->
<style type="text/css">
    @media only screen and (-webkit-min-device-pixel-ratio : 2),
        only screen and (min-device-pixel-ratio : 2) {

        head {
            background-image: url(/set-device-pixel-ratio/2);
        }
    }
</style>

Esse é quase todo o arquivo 'nginx.conf' da minha base. Deixou algumas partes por brevidade:

user www-data;
http {
    ##
    # Basic Settings
    ##
    sendfile on;

        include /etc/nginx/mime.types;
        default_type application_octet-stream;

        ##
        # Gzip Settings
        ##
        gzip on;
        gzip_disable "msie6";
        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript

        ##
        # Conditional variables--
        # Define a variable called "$webp_suffix" if the HTTP Accept header contains the "webp" substring
        # and populate it with 'webp', otherwise leave empty.
        ##
        map $http_accept $webp_suffix {
            default     ""
            "~*webp"    ".webp";
        }
}

Por fim, este é o bloco de servidores que criei para o meu site:

server {
    listen 80;
    server_name localhost;
    root /var/www;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    # Sets the device-pixel-ratio cookie
    location ~ /set-device-pixel-ratio/(/d+)/? {
        add_header Set-Cookie "device-pixel-ratio=$1;Path=/;Max-Age=31536000";
        return 204; # nginx does not allow empty 200 responses
    }

    # Serve appropriate image assets
    location ~(/assets/img/[^\.]+)(\.(?:jpg|jpeg|png|gif))$ {
        # Naming convention for hi-res images:
        set $hidpi_uri $1@2x$2;

        if ($http_cookie !~ 'device-pixel-ratio=2') {
            break;
        }

        try_files $hidpi_uri$webp_suffix $uri$webp_suffix $uri =404;
    }
}
    
por kaffolder 22.09.2014 / 05:01

1 resposta

2

Na sua diretiva try_files , você procura a imagem $uri$webp_suffix , que é resolvida como image.png.webp . Eu acho que você quer procurar por $1$webp_suffix lá.

Caso contrário, recomendo que você ative a diretiva nginx debug_connection <your_IP> em sua configuração principal e obterá um registro detalhado do que acontece durante a solicitação. Lá você pode ver melhor o que está acontecendo. Se você não conseguir descobrir, adicione o log da solicitação à pergunta e poderemos ajudar melhor.

    
por 22.09.2014 / 15:01