понедельник, 22 июля 2013 г.

Cache control with apache

mod_expires - модуль Apache, позволяющий указывать HTTP-заголовки Expires, давая указания кешировать статические файлы в пользовательском браузере. В результате работы модуля имеем снижения трафика и увеличение скорости отображения страниц. По умолчанию, Apache собирается уже с поддержкой mod_expires. Мы можем проверить его наличие командой:
httpd -M | grep mod_expires

Расположение файла httpd.conf:
httpd -V | grep ROOT

# кеширование в браузере на стороне пользователя
<IfModule mod_expires.c>

#Подключаем модуль
ExpiresActive On

ExpiresDefault "access 7 days"
#по умолчанию кеш в 5 секунд
    ExpiresDefault "access plus 5 seconds"
    #кэшировать флэш и изображения на месяц
    ExpiresByType image/x-icon "access plus 2592000 seconds"
    ExpiresByType image/jpeg "access plus 2592000 seconds"
ExpiresByType image/jpg "access plus 1 year"
    ExpiresByType image/png "access plus 2592000 seconds"
    ExpiresByType image/gif "access plus 2592000 seconds"
    ExpiresByType application/x-shockwave-flash "access plus 2592000 seconds"
    #кэшировать css, javascript и текстовые файлы на одну неделю
    ExpiresByType text/css "access plus 604800 seconds"
ExpiresByType text/x-javascript "access 1 year"
    ExpiresByType text/javascript "access plus 604800 seconds"
    ExpiresByType application/javascript "access plus 604800 seconds"
    ExpiresByType application/x-javascript "access plus 604800 seconds"
    #кэшировать html и htm файлы на один день
    ExpiresByType text/html "access plus 43200 seconds"
    #кэшировать xml файлы на десять минут
    ExpiresByType application/xhtml+xml "access plus 600 seconds"
</IfModule>
Короткая запись:
<ifmodule mod_expires.c>
<filesmatch ".(jpg|jpeg|gif|png|ico|css|js)$">
ExpiresActive on
ExpiresDefault "access plus 1 year"
</filesmatch>
</ifmodule>


Запретить любое кеширование:

<IfModule mod_headers.c>Header set Cache-Control: "no-cache, pre-check=0, post-check=0, max-age=0"
Header set Expires "Thu, 15 Apr 1999 20:00:00 GMT"
Header set Pragma: no-cache
Header unset ETag
Header unset Last-Modified
FileETag None</IfModule>
 
<IfModule mod_expires.c> 
ExpiresActive On 
ExpiresDefault "now"
</IfModule>  

mod_headers - this module provides directives to control and modify HTTP request and response headers. Headers can be merged, replaced or removed

http://httpd.apache.org/docs/2.2/mod/mod_headers.html
<ifModule mod_headers.c>
    #кэшировать html и htm файлы на один день
    <FilesMatch "\.(html|htm)$">
        Header set Cache-Control "max-age=43200"
    </FilesMatch>
    #кэшировать css, javascript и текстовые файлы на одну неделю
    <FilesMatch "\.(js|css|txt)$">
        Header set Cache-Control "max-age=604800"
    </FilesMatch>
    #кэшировать флэш и изображения на месяц
    <FilesMatch "\.(flv|swf|ico|gif|jpg|jpeg|png)$">
        Header set Cache-Control "max-age=2592000"
    </FilesMatch>
    #отключить кэширование
    <FilesMatch "\.(pl|php|cgi|spl|scgi|fcgi)$">
        Header unset Cache-Control
    </FilesMatch>
</IfModule> 
Pragma: no-cache - из старой версии протокола HTTP/1.0. Практически все браузеры и прокси игнорируют.  

ETag - уникальный хеш («отпечаток») байтов файла. При запросе файла с сервера, браузер сначала получает ETag хеш файла на сервере, если локальный и серверный хеши совпадают, то браузер берет файл из локального кеша, а сервер не отправляет файл.

FileETag MTime Size

Syntax: FileETag component ...

INode
    The file's i-node number will be included in the calculation
MTime
    The date and time the file was last modified will be included
Size
    The number of bytes in the file will be included
All
    All available fields will be used. This is equivalent to:

    FileETag INode MTime Size
None
    If a document is file-based, no ETag field will be included in the response

Директивы, допускаемые в запросах
Директива Описание
no-cache Сервер не должен использовать кэшированный ответ.
no-store Ответ на этот запрос не должен кэшироваться.
max-age=delta-seconds Клиент допускает кэшированный ответ, если его возраст не превышает delta-seconds секунд; клиент не требует его валидации.
max-stale=delta-seconds Клиент допускает кэшированный ответ, если его возраст не превышает delta-seconds секунд.
min-fresh=delta-seconds Клиент допускает кэшированный ответ, если он будет оставаться действительным не менее delta-seconds секунд от момента запроса.
no-transform К запрашиваемому документу не должны применяться преобразования.
only-if-cached Допускается только кэшированный ответ. Если подходящего ответа нет в кэше, то не нужна ни валидация старого ответа, ни получение нового.


Директивы, допускаемые в ответах
Директива Описание
public Ответ разрешается сохранять в любом кэше.
private Ответ разрешается сохранять только в закрытом кэше (т.е. только для этого пользователя).
no-cache Кэшированный ответ не должен использоваться без предварительной его валидации.
no-store Ответ не разрешается сохранять в кэше.
no-transform К передаваемому документу не должны применяться преобразования.
must-revalidate Если кэшированный ответ устарел, то к нему должна применяться процедура валидации. Эта директива отменяет действие max-stale.
max-age=delta-seconds Клиент допускает кэшированный ответ, если его возраст не превышает delta-seconds секунд; клиент не требует его валидации.
s-maxage=delta-seconds То же, что max-age, но действует только на открытые кэши.
proxy-revalidate То же, что must-revalidate, но действует только на прокси-сервера.

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.5.1
http://www.mnot.net/cache_docs/#PRAGMA
http://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%B7%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BA%D0%BE%D0%B2_HTTP
http://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%B0-%D1%82%D0%B5%D0%B3%D0%B8#.D0.9Ce.D1.82a-.D1.82e.D0.B3_Pragma 

Комментариев нет:

Отправить комментарий