Кэширование css, js, txt файлов, проанализированных php - PullRequest
3 голосов
/ 19 ноября 2010

Вопрос

Я провожу небольшой эксперимент и могу использовать некоторую помощь.
Я создал 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");
?>

Ответы [ 2 ]

1 голос
/ 19 ноября 2010

Вам нужно взглянуть на входящие заголовки HTTP и определить, был ли файл CSS законно изменен за это время. Это означает, что вы будете смотреть на If-Modified-Since в заголовках запроса. Вот код, который сделает это за вас:

$last_modified = filemtime("main-real.css");
if(isset($_SERVER["HTTP_IF_MODIFIED_SINCE"])) {
    $expected_modified = strtotime(preg_replace('/;.*$/','',$_SERVER["HTTP_IF_MODIFIED_SINCE"]));
    if($last_modified <= $expected_modified) {
        header("HTTP/1.0 304 Not Modified");
        return;
    }
}
1 голос
/ 19 ноября 2010

Какие заголовки Apache отправит для main-real.css не имеет значения, потому что вы include() отправляете этот файл через файловую систему.

Вам нужно отправить те же заголовки через скрипт PHP, прежде чем включать другой файл.

header("Cache-Control: ........ ");
header("Expires: ....... ");
....
include("main-real.css"); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...