Como posso obter o Nginx para dizer ao Firefox para armazenar em cache o meu conteúdo?

1

Os cabeçalhos a seguir (de uma resposta de mídia estática) não levam ao cache no Firefox. No Chrome eles fazem.

HTTP/1.1 200 OK
Server: nginx
Date: Sat, 22 Dec 2012 21:20:39 GMT
Content-Type: application/x-javascript; charset=utf-8
Last-Modified: Fri, 21 Dec 2012 19:28:54 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Cache-Control: public, max-age=86400
Content-Encoding: gzip

Meu servidor Nginx para conteúdo estático se parece com isso:

server {
    listen 80;
    server_name static.example.com;

    # Logs
    access_log /var/log/nginx/static.example.com.access.log;
    error_log /var/log/nginx/static.example.com.error.log;

    # Root
    location / {
        alias /var/www/app/deps/current/repo/src/example/static/;
        add_header Cache-Control "public, max-age=86400";
    }
}

Eu também tentei usar expires 24h; , no lugar de add_header ... , sem sorte.

Eu encontrei numerosas queixas semelhantes na Internet, mas nenhuma solução, nem nenhuma idéia do porquê, além da menção de uma pessoa de como o Firefox propositalmente se desvia da especificação para lidar com cabeçalhos HTTP 1.1 Cache-Control .

Existe alguma maneira de fazer o Firefox armazenar em cache minha mídia estática, por meio de um cabeçalho ou de vários cabeçalhos? Não quero que 75% das solicitações de mídia estática do meu servidor sejam provenientes de 20% dos meus usuários, apenas porque o Firefox está bloqueado.

Note que estou usando o Firefox 17.0.1 com configurações padrão, mas com o Firebug instalado e aberto na guia Net .

Atualização:

Usando, em vez disso:

expires 1d;
add_header Cache-Control public;

Faz com que os cabeçalhos incluam:

Expires: Wed, 26 Dec 2012 19:54:20 GMT
Cache-Control: max-age=604800, public

Isso também não faz com que o Firefox armazene o conteúdo em cache.

    
por orokusaki 22.12.2012 / 22:55

2 respostas

1

Como você determina que o Firefox não está armazenando seus arquivos em cache?

Quando um cabeçalho Last-Modified está presente em uma resposta, o navegador deve fazer todas as solicitações subsequentes para o mesmo URL com um If-Modified-Since cabeçalho e, em seguida, a resposta de um servidor pode conter apenas um cabeçalho (com sem corpo) se o arquivo não foi modificado desde.

IIRC, o Gecko também analisa a idade da Last-Modified date. Se é relativamente recente, então faz sentido que o conteúdo mude o tempo todo e tenha que ser solicitado novamente (com If-Modified-Since ou algo parecido) com bastante frequência. Por outro lado, se a data for de várias semanas, meses ou anos, o conteúdo provavelmente será armazenado em cache por um longo período de tempo.

Outra coisa a se olhar: você realmente tem o fuso horário e a hora corretos em sua máquina Firefox?

    
por 04.01.2013 / 20:33
0
server {
    expires    1d;
    add_header Cache-Control public;
    listen 80;
    ....
}

Tente assim, como descrito em docs nginx

Então eu era courious e tentei me fazer cache com a configuração abaixo. O que eu mudei é que eu iniciei um aplicativo em localhost: 4567. Considerando que no site externo um proxypass é configurado. Mais ou menos como a maioria dos exemplos de cache que eu poderia encontrar.

user nginx; worker_processes 2;
error_log /var/log/nginxtesterror.log; pid /run/nginx.pid;
events { worker_connections 1024; }
http { include /etc/nginx/mime.types; default_type
    application/octet-stream;
    log_format main '$remote_addr - $remote_user [$time_local]
                      "$request" ' '$status $body_bytes_sent
                      "$http_referer" ' '"$http_user_agent"
                      "$http_x_forwarded_for"';
    access_log /var/log/nginx/access.log main;
    sendfile on; #tcp_nopush on; keepalive_timeout 65;
    proxy_cache_path
    /var/www/app/deps/current/repo/src/example/static/ levels=1:1:2
    keys_zone=one:200m max_size=1000m loader_files=2000 inactive=60m;
    proxy_temp_path /var/www/app/deps/current/repo/src/example/tmp;
    proxy_cache_valid 1d;
    gzip on; gzip_disable msie6; gzip_static on; gzip_comp_level 4;
    gzip_proxied any; gzip_types text/plain text/css
    application/x-javascript text/xml application/xml
    application/xml+rss text/javascript;
    server { listen 80; server_name static.example.com;
        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_pass_header Set-Cookie ;
        location ~*
                .(?:ico|css|js|gif|jpe?g|png|pdf|zip|tar|t?gz|mp3|wav|swf)$
                { expires max; add_header Pragma public; add_header
                Cache-Control public; }

        location / { proxy_pass http://localhost:4567; proxy_cache_key
            $cache_key; proxy_cache one; add_header Cache-Control
            public; proxy_cache_valid 1d; proxy_cache_use_stale error
            timeout invalid_header http_500 http_502 http_504
            http_404; }
    }
    server {
        root /var/www/app/deps/current/repo/src/example/static/;
        listen 127.0.0.1:4567; set $cache_key
        $scheme$host$uri$is_args$args;

        # Logs access_log
        /var/log/nginx/static.example.com.access.log; error_log
        /var/log/nginx/static.example.com.error.log;

        # Root 
        location / {
            alias /var/www/app/deps/current/repo/src/example/static/; 
            } 
       }
}
    
por 23.12.2012 / 00:01

Tags