2016-02-13 5 views
8

Я пытаюсь оптимизировать свое приложение в Ruby on Rails, и я понял, что изображения в моем приложении - это то, что требуется для загрузки, но я также заметил еще одну проблему: что Google Chrome не кэширует изображения.Google Chrome не кэширует изображения

Я отметил это, потому что в Google Developers Console вы можете видеть, что Google Chrome делает запрос на загрузку изображений, которые были отменены до того, как изображения будут действительно загружены.

Это видно здесь, сначала я открываю Google Developers Console, а затем обновляю страницу и в первых запросах там вы можете увидеть изображения, но они сразу же отменены.

google_not_caching

После этого вы можете увидеть запросы, которые на самом деле загруженные изображения.

enter image description here

Я не понимаю, почему это происходит, если в заголовке ответа вы можете увидеть, что Cache Control установлен в publicmax-age = 31536... с

response_header

Я поместить изображения в моем применение таким образом:

<div class="col-xs-3"><%= image_tag "#{@hero.id}/ability_1.png", class: "center-block"%></div> 

И изображения организованы в папках в app/assets/images

Есть ли способ RoR исправить это?

Edit: Теперь тестирование моего приложения (которое в Heroku) в Windows я заметил, что на самом деле Google Chrome иногда кэширует изображения, но это происходит, как 50% времени (и когда я был в Ubuntu в он работал не один раз), в то время как в firefox при первом загрузке изображений, но в последующие времена я загружаю один и тот же вид, я даже не могу заметить перезагрузку, это красиво. Почему Google Chrome не похож на то, что ? Нормально, что Google Chrome действует так странно?

ответ

8

Самого главное для реализации при анализе кеширования браузера есть «Код состояния». В вашем примере вы можете увидеть, что у вас есть «304», что означает «Не изменено». Это означает, что браузер «потенциально может использовать кеш». Таким образом, вы на самом деле кэшируете. Кэширование! = Не попадание на ваш веб-сервер.

Определение в соответствии с Mozilla:

Это используется для кэширования. Он сообщает клиенту, что ответ не был изменен. Таким образом, клиент может продолжать использовать ту же кешированную версию ответа.

Он отправляет etag и последний раз редактировался на ваш веб-сервер, а затем ваш веб-сервер просматривает эти мета и скажет: «Нет, этот файл не изменился, поэтому не стесняйтесь использовать кеш» и это оно. На самом деле он больше не отправляет файл. Вы можете видеть, что «Размер» намного меньше, чем когда он является кодом статуса «200», где веб-сервер отправляет файл, а время также должно быть намного короче.

В Chrome вы можете принудительно «не кэшировать», установив опцию «Отключить кеш» на вкладке «Сеть».

Надеюсь, что это поможет!

+1

+1 для ясного объяснения 304, но я не думаю, что это действительно касается основной озабоченности OP: почему Chrome делает условный запрос GET вообще, учитывая параметр «max-age» в 'Cache-Control 'ответ заголовка? – eaj

1

Похоже, что Chrome действительно обрабатывает кэширование изображений по-разному. Какой тип перезагрузки вы делаете (по ссылкам, нажав enter в адресной строке, Ctrl + r)? Похоже, если вы нажмете ввести в строке поиска будет уважать максимальный возраст, но если вы используете Ctrl + R Chrome устанавливает максимального возраст 0.

expires_in max-age cache control doesn't work

Chrome doesn't cache images/js/css

1

Заголовки запроса содержат max-age = 0. Попробуйте установить это на большое количество!

Смежные вопросы