Generator .htaccess cache
Przyspiesz stronę dzięki cache i gzip
-
1Wprowadź dane
Wpisz treść, wklej tekst lub załaduj plik z dysku. -
2Kliknij przycisk
Narzędzie natychmiast przetworzy Twoje dane w przeglądarce. -
3Pobierz wynik
Skopiuj gotowy tekst lub zapisz plik na urządzeniu.
return "Wynik gotowy w 0.1s";
}
Oceń to narzędzie:
Powiązane narzędzia
Inne narzędzia, które mogą Ci się przydaćGenerator reguł cache w .htaccess
Odpowiednie nagłówki cache sprawiają, że powracający użytkownicy pobierają tylko zmienione pliki. To najprostszy sposób na szybsze ładowanie strony.
Jak dobierać czasy?
| Typ pliku | Zalecany czas |
|---|---|
| HTML | kilka minut – 1 dzień |
| CSS, JavaScript | miesiąc – rok (z wersjonowaniem) |
| Obrazy, fonty | rok |
| API, JSON | bez cache |
Kompresja mod_deflate
Gzip potrafi zmniejszyć pliki tekstowe nawet o 70–80%. Nie kompresuj obrazów i wideo — są już skompresowane i tylko stracisz CPU.
Wymagane moduły
mod_expires— nagłówki Expires i Cache-Control.mod_headers— własne nagłówki i Cache-Control immutable.mod_deflate— kompresja odpowiedzi.
Jak działa generator reguł cache w .htaccess
Generator nie zgaduje niczego o Twoim serwerze — składa plik .htaccess z trzech bloków: mod_expires, mod_headers i mod_deflate. Pierwszy odpowiada za czas życia kopii w przeglądarce. Dla każdego wybranego typu pliku powstaje dyrektywa ExpiresByType, która zamienia czas na dwa nagłówki: Expires z konkretną datą oraz Cache-Control: max-age. Wzór jest prosty: max-age to liczba sekund od momentu wysłania odpowiedzi do wygaśnięcia kopii. Jeśli ustawiasz dzień, wartością jest 86 400 s (24 × 3600), a rok przy 365 dniach to 31 536 000 s.
Drugi blok, mod_headers, dopisuje i nadpisuje nagłówki, których sam mod_expires nie wygeneruje. Najczęściej chodzi o Cache-Control: immutable dla plików z wersją w nazwie, usunięcie ETag (Header unset ETag) oraz Vary: Accept-Encoding, który rozdziela wersję skompresowaną od zwykłej w cache pośredniczącym. Trzeci blok, mod_deflate, włącza kompresję odpowiedzi dla typów tekstowych — HTML, CSS, JavaScript, JSON i SVG. Gzip zmniejsza takie pliki nawet o 70–80%, natomiast obrazów i wideo nie ma sensu kompresować, bo są już skompresowane i stracisz tylko CPU.
Kolejność bloków w pliku ma znaczenie. Dyrektywy z mod_headers wykonują się po tych z mod_expires, więc to one decydują ostatecznie o wartości Cache-Control. Dlatego wyjątki — na przykład no-store dla API i JSON — umieszcza się na końcu, a reguły ogólne na początku. Generator buduje plik w tej właśnie kolejności, ale po ręcznej edycji łatwo ją zepsuć i wtedy jeden nagłówek nadpisze drugi.
Przykład: policzone nagłówki krok po kroku
- Ustal grupy plików według zaleceń: HTML — kilka minut do 1 dnia, CSS i JavaScript — miesiąc do roku przy wersjonowaniu, obrazy i fonty — rok, API i JSON — bez cache.
- Przelicz czasy na sekundy, bo tylko tę wartość rozumie Cache-Control: 5 minut to 300 s, 1 dzień to 86 400 s, 30 dni to 2 592 000 s, a rok liczony jako 365 dni to 31 536 000 s.
- Wpisz w generatorze ExpiresByType: dla text/html 86400, dla text/css i application/javascript 31536000, dla image/* i font/* również 31536000.
- Dodaj blok mod_headers i ustaw Cache-Control public, max-age=31536000, immutable — ale wyłącznie dla plików, których nazwa zawiera hash lub numer wersji.
- Włącz mod_deflate dla text/html, text/css, application/javascript, application/json i image/svg+xml.
- Policz efekt: plik JavaScript o rozmiarze 200 KB po gzipie zmniejszy się o 70–80%, czyli do 40–60 KB. Oszczędność to 140–160 KB na plik, a przy pięciu takich plikach transfer spada z 1000 KB do 200–300 KB.
Nagłówki i dyrektywy trafiające do pliku
| Dyrektywa lub nagłówek | Moduł | Zastosowanie |
|---|---|---|
| ExpiresActive On | mod_expires | Włącza obsługę nagłówków wygasania w danym katalogu. |
| ExpiresByType | mod_expires | Ustawia datę wygaśnięcia i Cache-Control: max-age dla wybranego typu MIME. |
| Cache-Control: max-age | mod_expires lub mod_headers | Liczba sekund, przez które przeglądarka używa kopii bez pytania serwera. |
| Cache-Control: immutable | mod_headers | Dla zasobów z wersją w nazwie — brak rewalidacji przez cały czas max-age. |
| Header unset ETag | mod_headers | Usuwa ETag, gdy cache ma opierać się wyłącznie na Cache-Control. |
| Header append Vary Accept-Encoding | mod_headers | Rozdziela wersję skompresowaną i nieskompresowaną w cache pośredniczącym. |
| AddOutputFilterByType DEFLATE | mod_deflate | Włącza kompresję gzip dla typów tekstowych, nie dla obrazów i wideo. |
| Header set Cache-Control no-store | mod_headers | Dla API i JSON, których odpowiedź nie może zostać zapisana w cache. |
Jak używać wygenerowanych reguł bez psucia strony
- Wersjonuj nazwy plików — długi max-age i immutable stosuj tylko wtedy, gdy zmiana treści oznacza zmianę nazwy, na przykład hash w pliku CSS. Inaczej użytkownik zostanie ze starą wersją do końca wybranego czasu.
- Zacznij od krótszych czasów — dla HTML ustaw kilka minut do 1 dnia i wydłużaj po testach, a po rok dla CSS i JavaScript sięgaj dopiero wtedy, gdy masz już wdrożone wersjonowanie.
- Nie kompresuj dwa razy — gzip włączaj dla tekstu, bo tam daje nawet 70–80% oszczędności. Obrazy, wideo i fonty są już skompresowane, więc deflate zużyje CPU bez wyraźnego zysku.
- Sprawdź kolejność bloków — reguły z mod_headers umieszczaj tak, aby świadomie nadpisywały to, co ustawił mod_expires. W przeciwnym razie immutable lub no-store może nie zadziałać.
- Testuj na wybranym katalogu — wrzuć .htaccess do podkatalogu, sprawdź nagłówki Cache-Control, Content-Encoding i Expires w narzędziach deweloperskich, a dopiero potem przenieś plik wyżej.
Czego narzędzie nie uwzględnia i co zaburza wynik
- Nie zna Twojej infrastruktury — CDN, reverse proxy i cache serwera aplikacji mają własne czasy życia. Reguły z .htaccess ich nie omijają i mogą zostać nadpisane dalej w łańcuchu.
- Nie zastąpi wersjonowania — generator nie doda hasha ani numeru wersji do nazw plików. Jeśli opublikujesz nowy CSS pod tą samą nazwą, długi max-age opóźni zmianę u użytkownika.
- Nie sprawdzi, czy moduły są włączone — bez mod_expires, mod_headers i mod_deflate dyrektywy zwrócą błąd serwera albo zostaną zignorowane. Narzędzie nie odczyta konfiguracji Apache ani AllowOverride.
- Nie obejmuje odpowiedzi dynamicznych — skrypty PHP, frameworki i aplikacje JavaScript mogą wysyłać własne nagłówki, które nadpiszą reguły z .htaccess i zmienią faktyczny efekt cache.
Najczęstsze pytania
Co daje immutable?
Informuje przeglądarkę, że plik nigdy się nie zmieni — nie będzie nawet pytać o jego aktualność. Stosuj tylko dla wersjonowanych nazw plików.
Dlaczego wyłączyć ETag?
ETag utrudnia skuteczne cache'owanie na serwerach za load balancerem — słabszy od Cache-Control, może powodować zbędne żądania.
Jak sprawdzić efekt?
Użyj narzędzi deweloperskich przeglądarki lub testu szybkości. Sprawdź nagłówki Cache-Control, Content-Encoding i Expires.
Czy max-age w .htaccess podaje się w sekundach?
Tak, Cache-Control: max-age to liczba sekund od momentu wysłania odpowiedzi. Dzień to 86 400 s, 30 dni to 2 592 000 s, a rok liczony jako 365 dni to 31 536 000 s.
Dlaczego po zmianie CSS użytkownicy nadal widzą starą wersję?
Bo przeglądarka trzyma kopię przez cały czas max-age i nie pyta serwera o nowszą. Rozwiązaniem jest wersjonowanie nazwy pliku albo skrócenie czasu cache i wymuszenie odświeżenia.
Czy reguły cache z .htaccess działają na Nginx?
Nie. To składnia Apache. Na Nginx odpowiedniki ustawia się w konfiguracji serwera, między innymi przez expires, add_header i gzip.
Czy warto kompresować obrazy przez mod_deflate?
Nie. Gzip zmniejsza głównie pliki tekstowe, nawet o 70–80%, a obrazy i wideo są już skompresowane. Włączenie deflate dla nich zużyje CPU bez wyraźnego zysku.
Co dokładnie daje Cache-Control immutable?
Mówi przeglądarce, że plik nie zmieni się przez cały czas max-age, więc nie wysyła nawet warunkowego zapytania o jego aktualność. Stosuj wyłącznie dla zasobów z wersją w nazwie.