Jak zapobiec buforowaniu plików HTTP w serwerze Apache httpd (MAMP)

139

Zajmuję się tworzeniem aplikacji JavaScript dla jednej strony w MAMP. Moje pliki szablonów JavaScript i HTML są buforowane między żądaniami.

Czy istnieje prosty sposób na wskazanie w MAMP, że chcę zapobiec buforowaniu plików http? Ewentualnie z .htaccessplikiem? Gdzie mogę umieścić .htaccesslub zmodyfikować wirtualnego hosta dla MAMP na Macu?

dmck
źródło

Odpowiedzi:

318

Próbowałeś tego? Powinny działać w obie .htaccess, httpd.confiw sposób VirtualHost(zazwyczaj umieszczane w httpd-vhosts.confjeśli obejmowały go z httpd.conf)

<filesMatch "\.(html|htm|js|css)$">
  FileETag None
  <ifModule mod_headers.c>
     Header unset ETag
     Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
     Header set Pragma "no-cache"
     Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
  </ifModule>
</filesMatch>

100% zapobiega buforowaniu plików

Jest to podobne do sposobu, w jaki reklamy Google wykorzystują nagłówek Cache-Control: private, x-gzip-ok = "">, aby zapobiec buforowaniu reklam przez serwery proxy i klientów.

Od http://www.askapache.com/htaccess/using-http-headers-with-htaccess.html

Opcjonalnie dodaj rozszerzenie do plików szablonów, które pobierasz, jeśli używasz rozszerzenia innego niż .htmlte.

Charlie Rudenstål
źródło
2
Dziękuję, działa to bardzo dobrze w pliku .htaccess. Widzę opcje kontroli pamięci podręcznej, kiedy sprawdzam nagłówki, a moje pliki są wyświetlane z http 200 zamiast 304 między żądaniami, dokładnie to, czego potrzebowałem.
dmck
2
Nie zapomnij dodać polecenia LoadModule. LoadModule headers_module lib/modules/mod_headers.so
Spenhouet
Czy mogę zastosować te nagłówki do wszystkich typów plików, zamiast definiować rozszerzenia pojedynczo?
Thariq Nugrohotomo
1
@ThariqNugrohotomo Tak, to możliwe! To wyrażenie regularne, możesz spróbować <filesMatch "\.+">lub<filesMatch ^>
Charlie Rudenstål
Nie używam MAMP, ale Apache na serwerze internetowym. Musiałem również włączyć nagłówki i wygasanie modułów w mojej instalacji Apache, wpisując „sudo a2enmod headers” i „sudo a2enmod expires”, a następnie restart usługi sudo apache2. Polecenia / tagi LoadModule i IfModule nie były konieczne - po prostu pomiń powyższe części znacznika IfModule w nawiasach, ale nadal wprowadź ustawienia nagłówka między nimi. -
andruo11
5

Na podstawie przykładu tutaj: http://drupal.org/node/550488

Poniższe prawdopodobnie będą działać w .htaccess

 <IfModule mod_expires.c>
   # Enable expirations.
   ExpiresActive On

   # Cache all files for 2 weeks after access (A).
   ExpiresDefault A1209600

  <FilesMatch (\.js|\.html)$>
     ExpiresActive Off
  </FilesMatch>
 </IfModule>
Frank Farmer
źródło
Niestety to nie działa, gdy umieszczam plik .htaccess w katalogu mojego projektu. Nie jestem pewien, czy mod_expires jest aktywny.
dmck
5
@dmck: usuń sekcję <IfModule mod_expires.c>i </IfModule>.. jeśli mod_expires nie jest włączone, pojawi się błąd zamiast cichego ignorowania tych dyrektyw.
Stennie
W katalogu projektu każdy drobny błąd składni może spowodować błąd 500.
SDsolar
3

Miałem ten sam problem, ale znalazłem tutaj dobre rozwiązanie: Zatrzymaj buforowanie PHP 5.5.3 w MAMP

Zasadniczo znajdź plik php.ini i zakomentuj linie OPCache. Mam nadzieję, że ta alternatywna odpowiedź pomoże również innym.

acarito
źródło
3
chodzi o buforowanie PHP po stronie serwera, czyli OPCache. Pytanie dotyczy plików zapisywanych w pamięci podręcznej przez przeglądarkę żądanych przez HTTP.
Flion
2

Bez mod_expires trudniej będzie ustawić nagłówki wygaśnięcia w plikach. Dla czegokolwiek wygenerowanego możesz z pewnością ustawić domyślne nagłówki w odpowiedzi, wykonując zadanie mod_expires w ten sposób:

<?php header('Expires: '.gmdate('D, d M Y H:i:s \G\M\T', time() + 3600)); ?>

(wzięte z: Odpowiedź przepełnienia stosu z @brianegge , gdzie wyjaśniono również rozwiązanie mod_expires)

Teraz to nie zadziała w przypadku plików statycznych , takich jak pliki javascript. Jeśli chodzi o pliki statyczne, między przeglądarką a plikiem źródłowym znajduje się tylko apache (bez modułu przedawnienia). Aby zapobiec buforowaniu plików javascript, które jest wykonywane w Twojej przeglądarce, możesz użyć losowego tokena na końcu adresu URL js, coś w rodzaju ?rd=45642111, więc adres URL wygląda następująco:

<script type="texte/javascript" src="my/url/myjs.js?rd=4221159546">

Jeśli ten adres URL na stronie jest generowany przez plik PHP, możesz po prostu dodać losową część za pomocą PHP. Ten sposób losowego ustawiania adresu URL poprzez proste dołączanie losowych parametrów ciągu zapytania jest podstawową rzeczą, na przykład przy ustawieniu braku pamięci podręcznej w żądaniu ajax jQuery. Przeglądarka nigdy nie uzna dwóch adresów URL z różnymi ciągami zapytań za takie same i nigdy nie użyje wersji z pamięci podręcznej.

EDYTOWAĆ

Zauważ, że powinieneś również przetestować mod_headers . Jeśli masz mod_headers, możesz ustawić nagłówki Expires bezpośrednio za pomocą słowa kluczowego Header .

regilero
źródło
Dzięki, niestety nie używam żadnych plików PHP. Przyjrzę się mod_headers i instalacji mod_expires.
dmck
A co z zapobieganiem buforowaniu plików CSS?
Aaron Franke
1
<FilesMatch "\.(js|css)$">
  ExpiresActive On
  ExpiresDefault A1
  Header append Cache-Control must-revalidate
</FilesMatch>
Bipin Bahuguna
źródło
To nie jest dobra odpowiedź. Spróbuj szczegółowo wyjaśnić, jakie kroki należy wykonać, aby rozwiązać problem zgłoszony w PO.
leopal