LINUX.ORG.RU

js,css + gzip, проблемы с заголовками


0

0

суть проблемы:
допустим сейчас на сервер разположены довольно объемные js файлы,  
засчет .htaccess выставленно их кеширование
 41 <IfModule mod_expires.c>
 42         ExpiresActive on
 43         ExpiresByType image/jpeg "access plus 21 day"
 44         ExpiresByType image/gif "access plus 21 day"
 45         ExpiresByType text/css "access plus 30 day"
 46         ExpiresByType text/javascript "access plus 30 day"
 47 </IfModule>
 48
 49 FileETag MTime Size

пример ответа:
js/script.js                304 Not Modified

Date	Tue, 09 Sep 2008 12:31:18 GMT
Server	Apache/2.2.9 (Debian) DAV/2 SVN/1.5.1 PHP/5.2.6-3 with Suhosin-Patch mod_python/3.3.1 Python/2.5.2 mod_perl/2.0.4 Perl/v5.10.0
Connection	Keep-Alive
Keep-Alive	timeout=15, max=99
Etag	"21662-279c-45665b23efa40"

но всеже хотел загзипировать содержимое, что бы было всем хорошо, даже тем кто в первый раз попал на сайт, 
почетав статьи про оптимизацию добавил вот такой код в .htaccess
 (ну и загзипировал файлики соотвественно - #gzip -9 script.js > script.js.gz)

  1 <IfModule mod_header.c>
  2     Header append Vary User-Agent    // это нужно для ie
  3     <FilesMatch .*\.js.gz$>   // если запрашиваем script.js.gz
  4         ForceType text/javascript   // передать в заголовке тип
  5         Header set Content-Encoding: gzip // скажить что данные сжаты
  6     </FilesMatch> 
  7     <FilesMatch .*\.css.gz$>
  8         ForceType text/css
  9         Header set Content-Encoding: gzip
 10     </FilesMatch>
 11 </IfModule>

не знаю почему, может быть где-то ошибся но ff и ie не видят что данные загзипованы, 
в firebug в заголовках не вижу Content-Encoding: gzip, возможно я где-то ошибкся в htaccess =( 
(важно ли где растановка RewriteEngine и mod_header ? что за чем должно идти ?)


anonymous

решил сесть, написать скрипт на php:

пример: 
  script.php?js/javascript.js
  script.php?js/javascript.js.gz
код

  1 <?
  2 // проверка от хаков
  3 if(substr_count($_SERVER['QUERY_STRING'],"../") != false ) {
  9       die();
 10 }
 11
 12 // send the requisite header information and character set
 13 header ("content-type: text/javascript; charset: UTF-8");
 14
 15 // check cached credentials and reprocess accordingly
 16 // calc an offset of 600 min
 17 $offset = 36000;
 18 // calc the string in GMT not localtime and add the offset
 19 $expire = "Expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT";
 20 //output the HTTP header
 21 header($expire);
 22
 23 header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($_SERVER['QUERY_STRING'])).' GMT');
 24 if(strpos($_SERVER['QUERY_STRING'], '.gz') !== false) {
 25    if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 6') !== false)
 26       header('Cache-Control: private');
 27    else
 28       header("Cache-Control: max-age=$offset");
 29    header('Content-Encoding: gzip');
 30 }
 31 else
 32    header("Cache-Control: max-age=$offset");
 33
 34
 35 //if(file_exists(file($_SERVER['QUERY_STRING'])))
 36    echo implode('',file($_SERVER['QUERY_STRING']));
 37
 38 ?>

все заработало, браузеры стали получать верный заголовок с флагом gzip и соотвественно скрипты заработали,
но появилась другая проблема - данные перестали кошироваться 
вот заголовок ответа

script.php?js/javascript.js.gz             200 OK

Date	Tue, 09 Sep 2008 11:54:19 GMT
Server	Apache/2.2.9 (Debian) DAV/2 SVN/1.5.1 PHP/5.2.6-3 with Suhosin-Patch mod_python/3.3.1 Python/2.5.2 mod_perl/2.0.4 Perl/v5.10.0
X-Powered-By	PHP/5.2.6-3
Expires	Sat, 13 Sep 2008 15:54:19GMT
Last-Modified	Mon, 08 Sep 2008 17:24:49 GMT
Content-Encoding	gzip
Cache-Control	max-age=360000
Content-Length	2776
Keep-Alive	timeout=15, max=96
Connection	Keep-Alive
Content-Type	text/css; charset: UTF-8

=======================================================
без сжатия:
=======================================================
script.php?js/javascript.js             200 OK

Date	Tue, 09 Sep 2008 12:22:41 GMT
Server	Apache/2.2.9 (Debian) DAV/2 SVN/1.5.1 PHP/5.2.6-3 with Suhosin-Patch mod_python/3.3.1 Python/2.5.2 mod_perl/2.0.4 Perl/v5.10.0
X-Powered-By	PHP/5.2.6-3
Expires	Tue, 09 Sep 2008 22:22:41 GMT
Last-Modified	Tue, 26 Aug 2008 08:12:50 GMT
Cache-Control	max-age=36000
Keep-Alive	timeout=15, max=82
Connection	Keep-Alive
Transfer-Encoding	chunked
Content-Type	text/javascript; charset: UTF-8

те при обновленни станицы все равно приходит 200 OK, не могу добиться что бы ответ был 304 Not Modified,
как это происходить в первом варианте. 
Хотелось бы что бы данные у клиента не загружались заново, а брались из кеша, 
тк выходит что первый вариатн оказываться более экономный верно ?


всем зарание спасибо за ответы

anonymous
()
Ответ на: комментарий от anonymous

>не могу добиться что бы ответ был 304 Not Modified
для этого запрос должен быть соответствующий - lf-Modified-Since

xtron
()
Ответ на: комментарий от borisych

у masterhost'a не влючен этот модуль в апачь (второй апачь)
во свяком случае в списке модулей (apache_get_modules())
я его не вижу ((

anonymous
()
Ответ на: комментарий от xtron

>ля этого запрос должен быть соответствующий - lf-Modified-Since
а можно вас попросить чуть-чуть подробней...

anonymous
()
Ответ на: комментарий от anonymous

>а можно вас попросить чуть-чуть подробней...
Чтобы сервер включал сжатие браузер при запросе должен говорить что он умеет сжатие, так же и тут если у браузера уже есть этот документ в кеше он должен передавать заголовок If-Modified-Since серверу чтобы тот если документ не изменен возвращал не весь документ а только ответ что докумен не изменен.

xtron
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.