Skip to content

Wszystko o WordPressie, tworzeniu stron — i nie tylko

🛠 Jak dodać nagłówki Expires w .htaccess: instrukcja krok po kroku

🛠 Jak dodać nagłówki Expires w .htaccess: instrukcja krok po kroku

Uruchomił Pan test w GTmetrix, a tam na czerwono: „Add Expires Headers". Znajomy widok. Strona na WordPress, hosting na Apache, a test szybkości wymaga skonfigurowania buforowania przeglądarki przez jakiś .htaccess.

Błąd nie jest krytyczny, ale irytujący. Bez nagłówków Expires przeglądarka przy każdej wizycie ponownie pobiera z serwera obrazy, CSS i skrypty. Wielokrotnie. Nawet jeśli nic się nie zmieniło. Szybkość spada, użytkownik czeka, Google obniża pozycje.

Można to naprawić w pięć minut. Dwa sposoby: ręcznie przez kod w.htaccess albo wtyczką na dwa kliknięcia. Poniżej oba, z gotowym kodem i ustawieniami.

💡 Szybki przegląd:

  • Proszę zrozumieć, jak nagłówki Expires i Cache-Control zarządzają pamięcią podręczną przeglądarki
  • Proszę dodać gotowy kod do.htaccess: skopiować, wkleić, sprawdzić
  • Proszę zainstalować wtyczkę AEH Speed Optimization w minutę, jeśli nie chce Pan dotykać kodu
  • Proszę skonfigurować optymalne czasy buforowania dla obrazów, CSS, JS i czcionek

Jak działają nagłówki Expires

Gdy odwiedzający wchodzi na stronę, przeglądarka pobiera dziesiątki plików: stronę HTML, style CSS, JavaScript, czcionki, ikony, obrazy. Każdy plik to osobne żądanie HTTP do serwera. Im więcej żądań, tym dłuższe ładowanie.

Nagłówek Expires mówi przeglądarce: „ten plik się nie zmienia, zapisz go w pamięci podręcznej i nie pytaj o niego ponownie do takiej a takiej daty". Podczas kolejnej wizyty przeglądarka pobiera pliki z lokalnej pamięci podręcznej, zamiast ciągnąć je z serwera na nowo. Rezultat: minus dziesiątki żądań i szybkie ładowanie.

Współczesnym odpowiednikiem jest nagłówek Cache-Control z dyrektywą max-age. Określa on czas życia pamięci podręcznej w sekundach, a nie konkretną datę, i dziś jest uznawany za podstawowy. Radzimy konfigurować oba nagłówki jednocześnie: Expires dla starych przeglądarek i proxy, Cache-Control dla wszystkiego współczesnego. Oba zapisuje się w jednym bloku.htaccess.

Błąd Add Expires Headers w raporcie GTmetrix

Sposób 1: kod w.htaccess

Najprostsza droga: dodać reguły buforowania bezpośrednio do pliku konfiguracyjnego Apache. Plik .htaccess znajduje się w katalogu głównym strony (tam, gdzie wp-config.php). Jeśli go Pan nie widzi, proszę włączyć wyświetlanie ukrytych plików w kliencie FTP lub menedżerze plików hostingu.

Przed edycją koniecznie proszę pobrać kopię pliku na komputer. Błąd składni w.htaccess może położyć stronę z błędem 500, kopia zapasowa pozwoli cofnąć zmiany w sekundę.

Proszę otworzyć .htaccess w edytorze i dodać następujący blok przed # BEGIN WordPress:

1 # Кеширование браузера: заголовки Expires и Cache-Control
2<IfModule mod_expires.c>
3 ExpiresActive On
4
5 # Изображения
6 ExpiresByType image/jpg "access plus 1 year"
7 ExpiresByType image/jpeg "access plus 1 year"
8 ExpiresByType image/gif "access plus 1 year"
9 ExpiresByType image/png "access plus 1 year"
10 ExpiresByType image/webp "access plus 1 year"
11 ExpiresByType image/avif "access plus 1 year"
12 ExpiresByType image/svg+xml "access plus 1 year"
13 ExpiresByType image/x-icon "access plus 1 year"
14
15 # CSS и JavaScript
16 ExpiresByType text/css "access plus 1 month"
17 ExpiresByType application/javascript "access plus 1 month"
18
19 # Шрифты
20 ExpiresByType font/woff2 "access plus 1 year"
21 ExpiresByType font/woff "access plus 1 year"
22
23 # PDF и другие документы
24 ExpiresByType application/pdf "access plus 1 month"
25
26 # По умолчанию
27 ExpiresDefault "access plus 2 days"
28</IfModule>
29
30 # Заголовки Cache-Control для современных браузеров
31<IfModule mod_headers.c>
32 &lt;FilesMatch &quot;\.(jpg|jpeg|png|gif|webp|avif|svg|ico|woff2|woff)$&quot;&gt;
33 Header set Cache-Control "max-age=31536000, public"
34 </FilesMatch>
35 &lt;FilesMatch &quot;\.(css|js)$&quot;&gt;
36 Header set Cache-Control "max-age=2592000, public"
37 </FilesMatch>
38</IfModule>

Co tu się dzieje. Pierwszy blok <IfModule mod_expires.c> aktywuje moduł Expires i określa czasy przechowywania dla każdego typu plików. Rok dla obrazów i czcionek, one prawie się nie zmieniają. Miesiąc dla CSS i JavaScript, te są okresowo aktualizowane.

Drugi blok <IfModule mod_headers.c> dodaje współczesny Cache-Control z tymi samymi czasami, ale w sekundach: 31536000 = rok, 2592000 = miesiąc.

Ważne: moduły mod_expires i mod_headers muszą być włączone na serwerze. Na większości hostingów Apache są one domyślnie aktywne: support włącza je podczas wstępnej konfiguracji. Jeśli po zapisaniu buforowanie nie zadziałało, proszę napisać do supportu hostingu: „proszę włączyć mod_expires i mod_headers".

Po wstawieniu kodu proszę zapisać plik i wgrać go z powrotem do katalogu głównego strony. Proszę otworzyć stronę w przeglądarce, wejść w DevTools (F12) → Network → odświeżyć stronę. Proszę kliknąć na dowolny plik CSS lub JS, w zakładce Headers powinny pojawić się Expires i Cache-Control z niezerowymi wartościami.

Proszę ponownie uruchomić GTmetrix, błąd powinien zniknąć.

Sposób 2: wtyczka AEH Speed Optimization

Jeśli nie chce Pan ręcznie wchodzić w.htaccess, jest wtyczka. Kiedyś nazywała się po prostu Add Expires Headers, dziś rozrosła się do AEH Speed Optimization. Oprócz nagłówków buforowania potrafi minifikację CSS, leniwe ładowanie obrazów i kompresję.

Strona wtyczki AEH Speed Optimization w katalogu WordPress

Kolejność instalacji:

  • Wtyczki → Dodaj nową, w wyszukiwaniu proszę wpisać „AEH Speed Optimization"

  • Proszę kliknąć Zainstaluj teraz, potem Aktywuj

  • Proszę przejść do Ustawienia → AEH Speed Optimization

  • Na karcie Cache Settings proszę zaznaczyć typy plików i ustawić czasy przechowywania w dniach

Ustawienia pamięci podręcznej wtyczki AEH Speed Optimization
  • Proszę kliknąć Submit

Wtyczka sama dopisze reguły w.htaccess, nie będzie Pan musiał pisać ani jednej linijki kodu. Dla większości stron wersja darmowa jest wystarczająca. Wersja Pro dodaje kompresję Gzip, buforowanie zasobów zewnętrznych (czcionki Google, skrypty CDN) i niestandardowe typy plików.

Przykład konfiguracji czasu przechowywania dla grup plików

🔗 AEH Speed Optimization na WordPress.org

Jeśli ma Pan już wtyczkę buforowania typu W3 Total Cache lub WP Rocket, osobna wtyczka do Expires nie jest potrzebna. Każda poważna wtyczka cache potrafi automatycznie dodawać nagłówki Expires i Cache-Control w.htaccess. Proszę wejść w ustawienia swojej wtyczki i sprawdzić, czy zakładka Browser Cache jest aktywna.

Jaki czas buforowania ustawić

Nie ma uniwersalnej odpowiedzi, termin zależy od tego, jak często zmienia Pan konkretny typ plików.

Lista typów plików do konfiguracji pamięci podręcznej we wtyczce

Typ plików

Zalecany termin

Dlaczego

Obrazy (jpg, png, webp, avif, gif, svg)

1 rok

Zmieniają się rzadko, dużo ważą, maksymalny efekt buforowania

Ikony i favicon

1 rok

Nie zmieniają się latami

Czcionki (woff2, woff)

1 rok

Podłącza się je raz i nie aktualizuje

Style CSS

1 miesiąc

Poprawia Pan od czasu do czasu; przy zmianie designu proszę wyczyścić cache

JavaScript

1 miesiąc

Ta sama logika co dla CSS

PDF i dokumenty

1 miesiąc

Pobiera się rzadko, ale mogą być aktualizowane

Ogólna zasada: im stabilniejszy plik, tym dłuższy termin. Dla obrazów rok to standard. Dla CSS i JS miesiąc to rozsądny kompromis między szybkością a aktualnością.

Jeśli aktywnie dopracowuje Pan stronę i style zmieniają się co tydzień, proszę ustawić CSS na tydzień, a nie na miesiąc. Po zakończeniu poprawek proszę wrócić do miesiąca.

⁉️🤔 Często zadawane pytania

Dodałem kod do.htaccess, ale GTmetrix i tak pokazuje błąd. Dlaczego?

Najczęstsza przyczyna: moduły mod_expires lub mod_headers nie są włączone na serwerze. Proszę napisać do supportu hostingu z prośbą o aktywację obu modułów. Druga przyczyna: wstawił Pan kod po # BEGIN WordPress, a nie przed nim. WordPress nadpisuje wszystko, co jest po jego znaczniku. Trzecia: wtyczka buforowania (W3 Total Cache, WP Rocket) już zarządza.htaccess i nadpisała Pana reguły swoimi. W takim przypadku proszę skonfigurować Browser Cache wewnątrz samej wtyczki, a nie ręcznie.

Czym różni się Expires od Cache-Control?

Expires określa konkretną datę i czas („ważny do 15 czerwca 2027 roku"). Cache-Control z dyrektywą max-age określa czas trwania w sekundach od momentu żądania („ważny 31536000 sekund"). Cache-Control jest bardziej elastyczny i ma priorytet: jeśli ustawiono oba, przeglądarka słucha Cache-Control. Radzimy ustawiać oba dla maksymalnej kompatybilności ze starymi i nowymi klientami.

Strona na Nginx,.htaccess nie działa. Co robić?

Plik .htaccess to konfiguracja Apache. Nginx go ignoruje. Dla Nginx reguły buforowania dodaje się w sekcji server pliku konfiguracyjnego strony dyrektywą expires. Jeśli ma Pan Nginx (hostingi typu Kinsta, Cloudways), proszę użyć wtyczki AEH Speed Optimization: działa ona na każdym serwerze WWW, ponieważ zarządza nagłówkami przez PHP, a nie przez konfigurację serwera.

Czy trzeba konfigurować Expires, jeśli już używa się CDN?

Tak. CDN (Cloudflare, BunnyCDN) buforuje treść na swoich serwerach na całym świecie, ale pamięć podręczna przeglądarki to osobny poziom. Poprawnie skonfigurowane Expires i Cache-Control zmniejszają liczbę żądań nawet do CDN: przeglądarka w ogóle nie idzie do sieci po plik, jeśli jego lokalna kopia jest wciąż świeża. Dwa poziomy cache, CDN + przeglądarka, działają razem, a nie zastępują się nawzajem.

Czy wtyczka AEH Speed Optimization koliduje z moją wtyczką cache?

Może, jeśli obie próbują zapisywać reguły w.htaccess. Przed instalacją AEH Speed Optimization proszę wyłączyć Browser Cache w swojej głównej wtyczce buforowania lub odwrotnie: zostawić jedną wtyczkę, która zarządza zarówno pamięcią podręczną stron, jak i przeglądarki. WP Rocket i W3 Total Cache potrafią wszystko od razu, osobna wtyczka do Expires nie jest przy nich potrzebna.

Czy warto konfigurować Expires ręcznie, czy wystarczy wtyczka?

Jeśli pewnie pracuje Pan z FTP i nie boi się edytora kodu, ręczna konfiguracja przez.htaccess daje pełną kontrolę i nie dodaje zbędnej wtyczki do panelu administracyjnego. Kod powyżej: proszę skopiować, wkleić i sprawa zamknięta.

Dla wszystkich pozostałych wtyczka AEH Speed Optimization rozwiązuje zadanie bez ryzyka błędu w konfiguracji. Dodatkowo daje minifikację i leniwe ładowanie, które również przyspieszają stronę.

Najważniejsze: nie zostawiać błędu GTmetrix tak, jak jest. Pięć minut na skonfigurowanie nagłówków Expires daje zauważalny wzrost szybkości, a szybkość to zarówno doświadczenie użytkownika, jak i pozycje w wyszukiwarce.