Следующие заголовки (из статического медиа-ответа) не приводят к кешированию в Firefox. В Chrome они есть.
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
Мой сервер Nginx для статического контента выглядит так:
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";
}
}
Я также пробовал использовать expires 24h;
, на месте add_header ...
, без везения.
Я нашел множество похожих жалоб в Интернете, но никаких решений или идей, почему это так, кроме упоминания одним человеком о том, как Firefox намеренно отклоняется от спецификации для обработки HTTP 1.1. Cache-Control
заголовки.
Есть ли способ заставить Firefox кэшировать мои статические носители через заголовок или несколько заголовков? Я не хочу, чтобы 75% статических медиа-запросов моего сервера исходили от 20% моих пользователей только потому, что Firefox остановился.
Обратите внимание: я использую Firefox 17.0.1 с настройками по умолчанию, но с установленным Firebug и открытым для Net
таб.
Вместо этого используя:
expires 1d;
add_header Cache-Control public;
Заставляет заголовки включать:
Expires: Wed, 26 Dec 2012 19:54:20 GMT
Cache-Control: max-age=604800, public
Это также не заставляет Firefox кэшировать контент.
Как вы определяете, что Firefox не кэширует ваши файлы?
Когда Last-Modified
заголовок присутствует в ответе, браузер должен делать все последующие запросы для того же URL-адреса с If-Modified-Since
заголовок, и тогда ответ от сервера может содержать только заголовок (без тела), если с тех пор файл не изменялся.
IIRC, Gecko также смотрит, сколько лет Last-Modified
дата есть. Если это относительно недавно, то имеет смысл только то, что контент все время меняется и его нужно запрашивать повторно (с If-Modified-Since
и т.п.) довольно часто. С другой стороны, если датой несколько недель, месяцев или лет, то контент, вероятно, будет кэшироваться в течение длительного периода времени.
Еще одна вещь, на которую стоит обратить внимание: действительно ли у вас есть правильный часовой пояс и время на вашем компьютере с Firefox?
server {
expires 1d;
add_header Cache-Control public;
listen 80;
....
}
Попробуйте так, как описано в документы nginx
Так что я был мужественен и попытался кэшировать себя с конфигурацией ниже. Что я изменил, так это то, что я запустил приложение на localhost: 4567. Тогда как на внешнем сайте настроен proxypass. Более или менее похоже на большинство примеров кеширования, которые я смог найти.
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/;
}
}
}