Почему я не кэширую JavaScript и CSS? - PullRequest
10 голосов
/ 08 мая 2009

Похоже, что только javascript и css не кэшируются ... но изображения кэшируются.

Я использую Firebug, и когда я обновляю страницу, я замечаю в Firebug множество 200 ответов HTTP для js / css, но получаю 304 HTTP-кодов (содержимое не изменено ) для всех моих изображений. Похоже, что мой JS и CSS не кэшируются.

Кроме того, при использовании YSlow для определения проблемы с моим кэшированием контента JS / CSS он сообщает мне:

Есть 4 компонента с неправильно настроенными ETag

Ниже приведен мой файл .htaccess

Options -Indexes
Options +FollowSymLinks  

# Enable ETag
FileETag MTime Size

# Set expiration header
ExpiresActive on
ExpiresDefault "access plus 1 week"

# Compress some text file types
AddOutputFilterByType DEFLATE text/html text/plain text/css text/xml application/x-javascript text/javascript application/javascript application/json

# Deactivate compression for buggy browsers
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

# Set header information for proxies
Header append Vary User-Agent

Есть идеи, что не так с моим файлом доступа .htaccess, который мешает ему кэшировать мой CSS или JavaScript?

Ответы [ 6 ]

5 голосов
/ 14 декабря 2011

Пожалуйста, рассмотрите возможность отключения ETag's!

Рассмотрим следующие настройки:

Header unset ETag
FileETag None
Header set Cache-Control "max-age=2678400"

Первые два правила полностью отключают ETag, поэтому браузер вынужден прослушивать заголовок Cache-Control. Последнее правило указывает браузеру кэшировать файл 2678400 секунд или 1 месяц. Настройте параметры на то, что подходит вам больше всего. И примените эту конфигурацию к вашему каталогу, который содержит статические файлы (например, поместив файл .htaccess в этот каталог)

Необязательно, если вы используете несколько серверов для обслуживания статического контента и / или не уверены в том, когда эти серверы последний раз изменяли время, рассмотрите возможность использования:

Header unset Last-Modified

В нем указано, что Apache не должен обслуживать заголовки Last-Modified, поэтому браузеры могут прослушивать только заголовок max-age Cache-Control.

Эти настройки используются мной на многих сайтах hightraffic, и отключение заголовков ETag и Last-Modified, несомненно, помогло снизить трафик до одной пятой от того, что было раньше. Особенно Internet Explorer очень чувствителен к этим настройкам.

Имейте в виду: Отключение Last-Modified запретит браузерам запрашивать 304 содержимого, не измененных. По моему опыту это положительно, потому что у веб-сервера меньше запросов на обработку, а браузеры больше полагаются на настройки Cache-Control, которые вы обслуживаете. Но это может или не может вас устраивать. Некоторые браузеры будут пытаться проверять ресурсы каждые несколько минут, если вы предоставите им заголовок «Last-Modified», и поэтому я бы посоветовал полностью отключить его использование.

О, и если вы не уверены в своем кешировании; используйте http://www.redbot.org/ для тестирования ваших ресурсов, он быстро сообщает вам, что ваши заголовки означают для браузера, и как интерпретировать различные настройки управления кэшем, которые вы используете.

2 голосов
/ 15 сентября 2010

Это сообщение об ошибке YSlow вводит в заблуждение!

YSlow = на самом деле с жалобами на то, что вы используете ETags вообще!

YSlow запускается в вашем браузере - он не может знать, правильно ли настроены ETag. Практическое правило гласит, что вам не следует использовать ETag, потому что вы, скорее всего, неправильно настроили его, чем правильно настроили в многосерверной среде. (И YSlow предназначен для пользователей с большими, многосерверными веб-сайтами.)

Конечно, если вы работаете с одним сервером, или если вы работаете с распределенным сервером, но знаете, что делаете, то ETag - это просто замечательно. Но у YSlow нет никакого способа узнать это.

Об этом много говорится в комментариях на странице описания ошибки, которую вы должны проверить: http://developer.yahoo.net/blog/archives/2007/07/high_performanc_11.html

Также я нашел этот ответ на ServerFault, который повторяет точку: https://serverfault.com/questions/55919/yslow-says-etags-are-misconfigured-how-to-configure-etags-properly-on-iis7

2 голосов
/ 09 июня 2010

YSlow сообщает о неправильно настроенных etags, если они не придерживаются определенного шаблона. Поскольку вы сжимаете css и js, etags выводят что-то вроде этого:

Etag "1e10-4889909861a80"-gzip

Видите -gzip в конце? Это помещено там apache (только версия 2). Это то, что вызывает «ошибку». YSlow ожидает увидеть что-то вроде этого:

Etag "xxxx-xxxxxxxxxxxxx"

По сути, вы не можете это исправить, потому что он не сломан. Так что не сходите с ума, пытаясь получить идеальный результат, если не знаете, что делаете. Даже эта домашняя страница Yahoo получает только 90.

1 голос
/ 30 июля 2009

Я испытываю ту же проблему, что и вы. Удаление etag будет работать.

Добавьте следующее в файл конфигурации: FileETag none

1 голос
/ 08 мая 2009

Да, это правильное и общеизвестное поведение (может быть, оно и не нужно).

Читать http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html о ETag.

Возможно, вы хотите просто отключить ETag на сервере.

Редактировать: Кроме того, используйте дополнение LiveHTTPHeaders, чтобы понять, что делает ваш браузер. Для этой задачи он работает лучше, чем FireBug.

0 голосов
/ 11 января 2010

Привет, у меня была такая же проблема. Но просто положить в FileETag ничего не получилось

То, как я это исправил (и я не знаю, правильно ли это - но это работает) - я положил

FileETag none

внизу моего файла htaccess.

Тогда ySlow был счастлив.

...