Директивы Apache Vhost, оптимизированные для скорости страниц - PullRequest
3 голосов
/ 01 декабря 2010

Я сейчас использую эту настройку в моем vhost:

<Location />
  SetOutputFilter DEFLATE
  BrowserMatch ^Mozilla/4 gzip-only-text/html
  BrowserMatch ^Mozilla/4\.0[678] no-gzip
  BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
  SetEnvIfNoCase Request_URI \
  \.(?:gif|jpe?g|png)$ no-gzip dont-vary
  Header append Vary User-Agent env=!dont-vary
</Location>
<Directory />
  ExpiresActive On
  ExpiresByType text/html "access plus 5 minutes"
  ExpiresByType text/css "access plus 1 month"
  ExpiresByType application/x-javascript "access plus 1 month"
  ExpiresByType application/javascript "access plus 1 month"
  ExpiresByType text/javascript "access plus 1 month"
  ExpiresByType image/gif "access plus 1 month"
  ExpiresByType image/png "access plus 1 month"
  ExpiresByType image/jpg "access plus 1 month"
  ExpiresByType image/jpeg "access plus 1 month"
  ExpiresByType image/x-icon "access plus 1 month"
  ExpiresDefault "access plus 1 day"

  <FilesMatch "\.(ico|jpeg|pdf|flv|jpg|png|gif|js|css|swf)$">
    Header set Cache-Control "max-age=2592000, public"
    Header unset Last-Modified
    Header unset ETag
    FileETag None
  </FilesMatch>
  <FilesMatch "\.(html|php)$">
    Header set Cache-Control "max-age=900, public, must-revalidate"
  </FilesMatch>
</Directory>

Хотя это отлично работает для ускорения процесса, иногда пользователи не видят изменений, которые они сделали в контенте (в основном, при использовании FireFox) :( какие-либо предложения / советы по оптимизации?

Ответы [ 3 ]

1 голос
/ 16 декабря 2010

Вместо принудительного кэширования браузера вы должны отправить заголовок must-revalidate и управлять кэшированием изнутри вашего языка программирования (например, PHP), отправив заголовок Expires и Last-Modified.Затем браузер будет запрашивать у вашего сайта последнюю версию для каждого запроса, но обязательно отвечайте пустой страницей, если ничего не изменилось.

Это может занять некоторое время, но это определенно работает.

0 голосов
/ 13 декабря 2010

Публикация этого комментария после ответа от Hannes о том, что проблема основана на содержимом, а не в файлах js / css.

Однажды у меня была эта проблема, но я не смог понять, в чем проблема,Я предположил, что причиной может быть то, что HTML-страница кэшируется где-то на прокси-сервере между мной и браузером.

Итак, я сгенерировал URL с параметром запроса с именем hash, который имел что-то вроде md5 (time ("U"));

Например, URL, в котором возникла та же проблема, был похож на

http://test.com/controller/functionname/

После этой проблемы я изменил так, чтобы все URL-адреса пользователящелчки - это что-то вроде

http://test.com/controller/functionname/?hash={something}.

Надеюсь, это сработает для вас.Также, чтобы быть уверенным, вы можете добавить на свою веб-страницу.

<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
0 голосов
/ 11 декабря 2010

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

Например, предположим, у вас есть файл JS с именем script.js. Согласно следующим правилам, указанным в файле htaccess,

ExpiresByType application/x-javascript "access plus 1 month"  
ExpiresByType application/javascript "access plus 1 month"

файлы javascript кэшируются в течение месяца, и, следовательно, новые запросы для файлов JS не будут запрашиваться в течение 1 месяца, если только кэш не очищен вручную.

Как решить эту проблему.

Предполагая, что ваше имя файла - script.js, в файле HTML вы должны указать его как

<script src="includes/script.100.js" type="text/javascript"></script>

или

<link rel="stylesheet" type="text/css" href="includes/style.100.css" />  

100 может быть любым числом. Я обычно увеличиваю, если с 1, 2, 3 .. и т. Д. (Номер версии, чтобы быть точным).

Теперь в моем htaccess есть что-то вроде

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^includes/style\.[\d]+\.css$ /includes/style.css [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^includes/script\.[\d]+\.js$ /includes/script.js [L]

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...