Какие заголовки я должен использовать для обслуживания статического контента? - PullRequest
2 голосов
/ 19 декабря 2009

Я распаковываю статические файлы Javascript и CSS с использованием PHP. Когда запрашивается исходный файл, сервер отправляет заголовки Last-Modified и ETag. Я пока не отправляю их с PHP. Я также видел предложения использовать Cache-control и Expires заголовки и некоторые другие, которые я не помню.

Достаточно ли первых двух? Я полагаю, что с помощью PHP можно легко получить дату последнего изменения, но как бы я сгенерировал ETag?

Если лучше включить две другие, как лучше прикрепить их к другим файлам, таким как изображения? Может быть через .htaccess? (У меня нет прямого доступа к серверу.)

Ответы [ 4 ]

1 голос
/ 19 декабря 2009

См:

В основном вы хотите:

  • Минимизировать количество отправляемых файлов (путем их объединения, спрайтов и т. Д.);
  • Свернуть все файлы Javascript;
  • GZip all (для браузеров, которые правильно его поддерживают); и
  • Версия все.

Под версионностью я подразумеваю вместо:

<img src="/images/logo.gif">

добавить что-то для обозначения «версии», такой как mtime файла:

<img src="/images/logo.gif?1234568899">

Добавьте к этому заголовок Expires далекого будущего, чтобы браузер запрашивал файл только один раз. Затем, когда вы хотите, чтобы браузер получил новую копию, вы меняете номер версии.

ИМХО, это намного превосходит методы, использующие ETag и тому подобное.

1 голос
/ 19 декабря 2009

для ETag вы можете использовать любое значение, но я предпочитаю использовать md5_file () sha1_file () текущего файла [s] в качестве уникального идентификатора для контента (не должно быть такого количества коллизий).

Сделайте это перед любым выводом.

<?php header( "Etag: " . sha1_file( basename( $_SERVER[ 'PHP_SELF' ] ) ) ); ?>

или вы можете позволить Apache сделать это за вас в .htaccess (если он включен, который обычно есть):

# if we're clustered this will still be cool
FileETag MTime Size

И если вы хотите установить длительный срок действия (хотя это немного опасно), вы также можете сделать это:

# turn on far-future expiration dates
# to cache content longer (30 days)
ExpiresActive On
ExpiresDefault A2592000

Но будьте осторожны, вам придется создавать версию файла (), которую вы должны изменять каждый раз, когда обновляете файл.

0 голосов
/ 20 декабря 2009

Почему бы не использовать Apache напрямую для обслуживания статических запросов?

Он может сжимать вещи, а также правильно устанавливать заголовки и угадывать, что он также обрабатывает крайние случаи.

Правильная обработка условных запросов не очевидна, и я не думаю, что вам следует пытаться это делать. Используйте веб-сервер, который уже делает это.

Тем не менее, не все значения по умолчанию имеют смысл. Вам, вероятно, следует отключить ETag, если на вашем сайте имеется более одного веб-сервера, и установка заголовка «Expires» для нечасто изменяющегося содержимого в значительной степени обязательна, если вы хотите, чтобы кэши клиентов были наиболее полезными.

Посмотрите на несколько снисходительную,

http://developer.yahoo.com/performance/rules.html

Который вам поможет.

0 голосов
/ 19 декабря 2009

Apache использует метку inode-size-time в качестве Etag, однако это не работает, если у вас есть кластер веб-серверов. В этом случае вы можете использовать md5 url-size-timestamp. Больше информации в разделе Etag здесь

Я бы посоветовал не вычислять md5 всего файла, поскольку это может быть дорого для больших файлов (например, изображений, аудио, видео).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...