Вопрос
Я провожу небольшой эксперимент и могу использовать некоторую помощь.
Я создал 2 файла. main-real.css , который является стандартным простым старым файлом css, и main.css , который анализируется PHP и имеет include()
, который захватывает предыдущий файл реальной CSS.
Вот код для main.css :
<?php
include("main-real.css");
?>
Затем я добавляю инструкцию в мой файл .htaccess для анализа этого файла css с помощьюPHP:
<FilesMatch "main.css">
AddHandler application/x-httpd-php5 .css
Header Set Content-Type "text/css"
</FilesMatch>
Это прекрасно работает на моем сервере PHP 5.2, на котором работает Apache.
Проблема заключается в том, что этот файл не кэшируется браузером или, по крайней мере, не возвращает
304 Not Modified
Код состояния, подобный обычному CSS-файлу без синтаксического анализа PHP.
Вот заголовки для main-real.css при прямом доступе:
RESPONSE HEADERS
Date..............Thu, 18 Nov 2010 22:10:57 GMT
Server............Apache/2.2.14 (Unix) mod_ssl/2.2.14 OpenSSL/0.9.8i DAV/2 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635
Last-Modified.....Thu, 18 Nov 2010 22:10:23 GMT
Etag.............."11b010a-26-4955b0e6671c0"
Accept-Ranges.....bytes
Content-Length....38
Content-Type......text/css
REQUEST HEADERS
Accept.............text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language....en-us,en;q=0.5
Accept-Encoding....gzip,deflate
Accept-Charset.....ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive.........115
Connection.........keep-alive
Cookie.............fc=fcVal=7625790752294348480
If-Modified-Since..Thu, 18 Nov 2010 22:10:23 GMT
If-None-Match......"11b010a-26-4955b0e6671c0"
Cache-Control......max-age=0
Вот заголовки для синтаксического анализа PHP main.css :
RESPONSE HEADERS
Date...............Thu, 18 Nov 2010 22:11:11 GMT
Server.............Apache/2.2.14 (Unix) mod_ssl/2.2.14 OpenSSL/0.9.8i DAV/2 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635
X-Powered-By.......PHP/5.2.11
Content-Type.......text/css
Keep-Alive.........timeout=5, max=97
Connection.........Keep-Alive
Transfer-Encoding..chunked
REQUEST HEADERS
Accept.............text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language....en-us,en;q=0.5
Accept-Encoding....gzip,deflate
Accept-Charset.....ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive.........115
Connection.........keep-alive
Cookie.............fc=fcVal=7625790752294348480
Cache-Control......max-age=0
Я попытался изменить заголовки http различными способами, добавив max-age, last-модифицированы и другие безуспешно.Есть ли что-то, что я пропускаю или неправильно понимаю?
Решение и окончательный код
Основным отсутствующим фрагментом кода было то, что мне нужно было отправить заголовок Last-Modified
до включения ().Это должно быть сделано в самом файле PHP!Ранее я пытался добавить Last-Modified
, используя инструкцию .htaccess Header set
, и хотя это добавляет соответствующий заголовок, оно не вызывало кеширование.
Вот мой окончательный код для main.css сДальнейшее будущее Expires
заголовки и Cache-Control
для хорошей меры.
<?php
$last_modified = date("D, d M Y H:i:s \G\M\T", filemtime("main-shared.css"));
$expiration = date("D, d M Y H:i:s \G\M\T", strtotime('+1 year'));
header("Cache-Control: public, no-transform");
header("Expires: $expiration");
header("Last-Modified: $last_modified");
include("main-shared.css");
?>