2016-02-20 2 views
3

У меня есть файл php, который переименован в htaccess как файл css. Причина в том, что у меня есть некоторые стили и цвета, которые меняются в зависимости от некоторых параметров администратора.Я не могу кэшировать свой перезаписанный файл CSS PHP

В любом случае, я пытаюсь разрешить браузеру пользователя кэшировать файл. Вот что у меня есть:

style.php:

header("Content-type: text/css; charset: UTF-8"); 

// Start normal CSS styles... 

.htaccess:

RewriteRule ^assets/css/min/([a-zA-Z0-9\._-]+)/([a-zA-Z0-9\._-]+)/([a-zA-Z0-9\._-]+)\.css$ assets/css/min.php?style=$1&layout=$2&ver=$3 [L,QSA] 

# Compress 
AddOutputFilterByType DEFLATE text/css 

# Cache for 1 week 
<FilesMatch ".(css)$"> 
Header set Cache-Control "max-age=604800" 
</FilesMatch> 

<IfModule mod_expires.c> 
    ExpiresActive on 
    ExpiresByType text/css "access plus 1 week" 

</IfModule> 

В голове страницы:

<link rel="stylesheet" href="http://example.com/assets/css/min/blue/flat/0.9.2.css"> 

Каждый раз, когда новая страница загружается, содержимое страницы запрашивается. Это заголовки я получаю:

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Connection: Keep-Alive 
Content-Encoding: gzip 
Content-Length: 13881 
Content-Type: text/css; charset: UTF-8;charset=UTF-8 
Date: Sat, 20 Feb 2016 22:49:17 GMT 
Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Keep-Alive: timeout=5, max=94 
Pragma: no-cache 
Server: Apache/2.4.16 (Unix) OpenSSL/1.0.1p PHP/5.6.12 mod_perl/2.0.8-dev Perl/v5.16.3 
Vary: Accept-Encoding,User-Agent 
X-Powered-By: PHP/5.6.12 
+0

Я предполагаю, что это связано с тем, что (внутри, когда-то переписан) URL-адрес имеет строку запроса, поэтому не получается кэшироваться, хотя документы для Apache 2.4 state «Обычно запросы с параметрами строки запроса кэшируется отдельно для каждой уникальной строки запроса. Это согласно RFC 2616/13.9 выполняется только в том случае, если указано время истечения срока действия. ' & Кажется, вы устанавливаете время истечения срока действия - действительно ли mod_expires включен? –

+0

@RobGudgeon Да, mod_expires включен, потому что он работает для некоторых других типов файлов, которые у меня есть (изображения). – JROB

+0

ваш огонь «доступ плюс 1 неделя» для стандартных, непереписанных файлов CSS? –

ответ

3

Ваш mod_expires конфигурации применяется к файлам на основе их MimeType в восприятии веб-сервера. Если вы не выполнили какую-либо серьезную операцию по настройке веб-сервера в другом месте, веб-сервер не будет связывать текстовый/CSS-тип с файлами, заканчивающимися на .php (и если бы это было сделано, для их обработки с помощью парсера PHP потребовалось бы еще больше взломать). Заголовок, заданный вашим PHP-скриптом, не имеет отношения к этому процессу.

Хотя можно заставить mod_expires добавлять заголовки кэширования в ответ, вам также придется использовать mod_headers для remove значения PHP-наборов; когда браузеры получают несколько противоречивых инструкций кэширования, он будет использовать кратчайшее время истечения, выраженное в них.

Следовательно, чтобы кэшировать содержимое, вы должны передавать информацию кэширования непосредственно из скрипта PHP. Например.

header('Cache-control: max-age=604800; private'); 

Но, основываясь на времени истечения срока доступа, это не лучшее решение.

+0

Я попытался добавить это к скрипту PHP, и никаких изменений в полученных заголовках не было, и файл все еще не был кэширован. – JROB

+0

Тогда вы не устанавливали правильные заголовки.Отправьте новый вопрос с кодом PHP и заголовками, которые вы получили. – symcbean

+0

Я только что понял, добавил ли я заголовок («Pragma: cache»), файл отлично кэшируется. Я не знаю, где находится этот заголовок, но это то, что останавливало его от кеширования. – JROB

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