Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.05.2011, 10:23
Аватар для mycoding
NodeJS developer - ушел
Отправить личное сообщение для mycoding Посмотреть профиль Найти все сообщения от mycoding
 
Регистрация: 06.01.2010
Сообщений: 1,022

GZIP caching
Не знал куда можно отнести эту тему, поэтому напишу в оффтопик.

На днях с удивлением для себя обнаружил, что zgip не кэширеются.

Т.е. например мы хотим js файлы уменьшить в размере.
Возьмем к примеру файл какого-нибудь js framework-а.
Переименуем его на framework.php и перед кодом добавим следующие строки
<?php
	header("content-type: application/x-javascript");
        ob_start("ob_gzhandler");
?>


Затем глянем в firebug размер нашего framework-a, он уменьшится где то 3 раза.

Только вот дело в том, что эта штука не кэшируется, потому, при каждом таком запросе, в качестве даты создания файла, показывается текущее время сервера. Поэтому браузер опять загружает файл.

Как только не пробовал это исправить, ни в какую.

Способ первый (Жесткое кэширование, из статьи Ильи Кантора, и других источников)
Пишем вот эти строки в нашем php файле
<?php
	header("content-type: application/x-javascript");
	header("Expires: ".gmdate("D, d M Y H:i:s", time()+86400*365*12)." GMT");
	header("Cache-Control: max-age="+86400*365*12);
       ob_start("ob_gzhandler");
?>


Метод не работает, все равно загружается.

Способ второй.
C помощью 7-zip архивируем framework получаем файл
framework.jz.gz
И добавляем в файл .htaccess вот эти строки
(Возможно надо как то по другому, но перебрал все варианты, которые в встретил, это лишь один из них)
Код:
    RewriteEngine on
    RewriteRule ^(.*\.js\.gz)$ - [L]
    RewriteCond %{HTTP:Accept-Encoding} gzip
    RewriteCond %{REQUEST_FILENAME}.gz -f
    RewriteRule ^(.*)$ $1.gz
Кэширут, но наш framework перестает работать.

В качестве простого примера, сделал функцию
Поместил в файл function.js, дальше 7-zip получил function.js.gz
function hi(text){
	console.log(text);
}


И подключил в файле
<html>
<head>
<title>GZIP</title>
<script src='js/function.js.gz'></script>
<script>
	hi('hi');
</script>
</head>
<body>
</body>
</html>


Выдает ошибку:
illegal character
[Прерывать на этой ошибке] ‹PlПM


Может кто-нибудь знает как с этим справиться?

Пробовал в разных кодировках и utf-8 и windows-1251 результат одинаковый, пробовал
по разному архивировать: максимальное, нормальное сжатие.
Ответить с цитированием
  #2 (permalink)  
Старый 15.05.2011, 14:22
Аватар для subzey
Пионэр
Отправить личное сообщение для subzey Посмотреть профиль Найти все сообщения от subzey
 
Регистрация: 16.11.2009
Сообщений: 1,322

Можно использовать mod_gzip для Apache2 или ngx_http_gzip_module для Nginx. Тогда сжатием данных будет заниматься непосредственно сервер (или реверс-прокси), и у Вас всегда будет прозрачная и правильная обработка Last-Modified, If-Modified-Since и прочего.
Ответить с цитированием
  #3 (permalink)  
Старый 15.05.2011, 19:53
Аватар для mycoding
NodeJS developer - ушел
Отправить личное сообщение для mycoding Посмотреть профиль Найти все сообщения от mycoding
 
Регистрация: 06.01.2010
Сообщений: 1,022

На сервере mod_gzip есть - phpinfo выводит сообщение, что он есть.

Я уже согласен, просто делать gzip файл для тех файлов, которые не будут обновляться, но лишь бы это работало.

Но не работает.

Почему вот такая строка ставит в тупик браузер.
Цитата:
<script src='js/function.js.gz'></script>
И .htaccess не помогает.
Цитата:
AddEncoding gzip .gz
<FilesMatch "^.*\.js\.gz$">
ForceType text/javascript
Header set Content-Encoding: gzip
</FilesMatch>
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} !".*Safari.*" [OR]
RewriteCond %{HTTP_USER_AGENT} !".*Konqueror.*"
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{REQUEST_FILENAME}.gz -f
RewriteRule ^(.*)\.js$ $1.js.gz [L,QSA,T=text/javascript]
Понять не могу в чем дело.
Выдает ошибку
"illegal character
[Прерывать на этой ошибке] ‹PlПM"

Может у меня 7-zip не правильный, я уж не знаю что и думать.
Ответить с цитированием
  #4 (permalink)  
Старый 16.05.2011, 15:51
Аватар для subzey
Пионэр
Отправить личное сообщение для subzey Посмотреть профиль Найти все сообщения от subzey
 
Регистрация: 16.11.2009
Сообщений: 1,322

Странно, вроде, должно работать.
Посмотрите на всякий случай файрбагом/драгонфлаем/инспектором, приходит ли браузеру в ответ заголовок Content-Encoding.
Ответить с цитированием
  #5 (permalink)  
Старый 16.05.2011, 17:39
Аватар для mycoding
NodeJS developer - ушел
Отправить личное сообщение для mycoding Посмотреть профиль Найти все сообщения от mycoding
 
Регистрация: 06.01.2010
Сообщений: 1,022

Мне хостер сказал для всех известных расширений,
нельзя ничего у них на сервере применить в файле .htaccess.

Думаю сделать так
function.js.mygz а дальше по шаблону, может сработает.
Ответить с цитированием
  #6 (permalink)  
Старый 16.05.2011, 18:21
Аватар для subzey
Пионэр
Отправить личное сообщение для subzey Посмотреть профиль Найти все сообщения от subzey
 
Регистрация: 16.11.2009
Сообщений: 1,322

Радикально. А что за хостер, если не секрет?
Ответить с цитированием
  #7 (permalink)  
Старый 16.05.2011, 18:47
Аватар для mycoding
NodeJS developer - ушел
Отправить личное сообщение для mycoding Посмотреть профиль Найти все сообщения от mycoding
 
Регистрация: 06.01.2010
Сообщений: 1,022

Укажу в личке.
А то не хочется делать негативную рекламу.
Ответить с цитированием
  #8 (permalink)  
Старый 18.05.2011, 22:52
Аватар для mycoding
NodeJS developer - ушел
Отправить личное сообщение для mycoding Посмотреть профиль Найти все сообщения от mycoding
 
Регистрация: 06.01.2010
Сообщений: 1,022

Не выходит никак.
Пожалуйста попробуйте у себя на сервере зипануть вот этот код
function hi(text){
    console.log(text);
}

И настроить так, чтобы всё работало как написано выше и дайте пожалуйста линк.
Если конечно нетрудно.
Ответить с цитированием
  #9 (permalink)  
Старый 20.05.2011, 12:29
Аватар для subzey
Пионэр
Отправить личное сообщение для subzey Посмотреть профиль Найти все сообщения от subzey
 
Регистрация: 16.11.2009
Сообщений: 1,322

mycoding,
http://immelman.ru/test/gz/index.html
Выложил .htaccess и .gzip. Всё работает без проблем.
Ответить с цитированием
  #10 (permalink)  
Старый 20.05.2011, 15:28
Аватар для mycoding
NodeJS developer - ушел
Отправить личное сообщение для mycoding Посмотреть профиль Найти все сообщения от mycoding
 
Регистрация: 06.01.2010
Сообщений: 1,022

subzey,
ОГРОМНЕЙШЕЕ СПАСИБО, я не понимал азов.
Заместо
<script src='js/function.js'></script>

Писал
<script src='js/function.js.gz'></script>


Я не понимал, что делает .htaccess

У меня на сервере тоже все заработало.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
xml string to base64 gzip rwstudent Общие вопросы Javascript 13 27.11.2010 01:11
Javascript в GZip megapup Серверные языки и технологии 7 16.10.2010 00:01