Dyrektywy .htaccess, które pomogą w poprawie szybkości strony

utworzone przez | wrz 11, 2024 | Optymalizacja stron internetowych

Poniżej przedstawiam dyrektywy, które mogą znacząco przyspieszyć działanie Twojej strony internetowej, wpływając na kompresję, cache, oraz efektywność przetwarzania zasobów przez serwer. Pamiętaj jednak, że zmiany w pliku .htaccess należy wprowadzać z rozwagą. Nie każda optymalizacja będzie odpowiednia dla każdej witryny, a nadmierna liczba modyfikacji lub niewłaściwie skonfigurowane dyrektywy mogą spowodować nieoczekiwane problemy z funkcjonowaniem strony. Ważne jest, aby testować wprowadzone zmiany i dostosowywać je do specyficznych potrzeb serwisu.

1. Kompresja GZIP (mod_deflate)

Kompresja GZIP zmniejsza rozmiar plików HTML, CSS, JavaScript i innych tekstowych zasobów, co skraca czas ich przesyłania.

<IfModule mod_deflate.c>
  AddOutputFilterByType DEFLATE text/html text/plain text/xml
  AddOutputFilterByType DEFLATE text/css
  AddOutputFilterByType DEFLATE text/javascript
  AddOutputFilterByType DEFLATE application/javascript
  AddOutputFilterByType DEFLATE application/x-javascript
  AddOutputFilterByType DEFLATE application/xml
  AddOutputFilterByType DEFLATE application/xhtml+xml
  AddOutputFilterByType DEFLATE application/rss+xml
  AddOutputFilterByType DEFLATE application/atom_xml
  AddOutputFilterByType DEFLATE application/x-font-ttf
  AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
  AddOutputFilterByType DEFLATE font/opentype
  AddOutputFilterByType DEFLATE font/woff font/woff2
  AddOutputFilterByType DEFLATE image/svg+xml
</IfModule>

2. Cache zasobów (mod_expires)

Zarządzanie cache pozwala przechowywać zasoby w przeglądarce użytkownika przez określony czas, co zmniejsza liczbę żądań do serwera.

<IfModule mod_expires.c>
  ExpiresActive On
  ExpiresByType image/jpg "access plus 1 year"
  ExpiresByType image/jpeg "access plus 1 year"
  ExpiresByType image/gif "access plus 1 year"
  ExpiresByType image/png "access plus 1 year"
  ExpiresByType text/css "access plus 1 month"
  ExpiresByType application/pdf "access plus 1 month"
  ExpiresByType application/javascript "access plus 1 month"
  ExpiresByType text/javascript "access plus 1 month"
  ExpiresByType application/x-shockwave-flash "access plus 1 month"
  ExpiresByType image/x-icon "access plus 1 year"
  ExpiresDefault "access plus 2 days"
</IfModule>

3. Cache-Control (mod_headers)

Nagłówki Cache-Control mogą określić, jak długo przeglądarka powinna przechowywać zasoby.

<IfModule mod_headers.c>
  <FilesMatch "\.(jpg|jpeg|png|gif|swf|css|js|woff|woff2|ttf|svg)$">
    Header set Cache-Control "max-age=31536000, public"
  </FilesMatch>
</IfModule>

4. Prefetching (mod_headers)

Prefetching pozwala na wcześniejsze ładowanie zasobów, co przyspiesza przyszłe żądania.

<IfModule mod_headers.c>
  <link rel="dns-prefetch" href="//example.com">
  Header set Link "</path/to/resource>; rel=preload; as=script"
</IfModule>

5. Usunięcie ETags (mod_headers)

ETag to nagłówek HTTP, który jest rzadko potrzebny i może zwiększać obciążenie serwera. Można go usunąć.

<IfModule mod_headers.c>
  Header unset ETag
</IfModule>
FileETag None

6. Zmniejszenie liczby połączeń (KeepAlive)

Dyrektywa KeepAlive pozwala na utrzymywanie połączeń HTTP otwartych, co zmniejsza opóźnienia przy wielu żądaniach.

<IfModule mod_headers.c>
  Header set Connection keep-alive
</IfModule>

7. Minimalizacja liczby przekierowań (mod_rewrite)

Przekierowania mogą spowolnić ładowanie strony. Użyj poniższych dyrektyw, aby minimalizować ich liczbę.

RewriteEngine On
# Przekierowanie z www do non-www (lub odwrotnie, zależnie od preferencji)
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/\ [R=301,L]

8. Optymalizacja obsługi plików multimedialnych (mod_headers)

Dodanie nagłówków Vary do odpowiedzi serwera poprawia caching dla zasobów multimedialnych.

<IfModule mod_headers.c>
  Header append Vary: Accept-Encoding
</IfModule>

9. Kompresja plików CSS i JS (mod_rewrite)

Automatyczna kompresja plików CSS i JS może przyspieszyć ładowanie zasobów.

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^(.*)\.css$ $1.min.css [L]
  RewriteRule ^(.*)\.js$ $1.min.js [L]
</IfModule>

10. Zmniejszenie rozmiaru cookies

Używanie małych plików cookie lub ich eliminacja w przypadku zasobów statycznych zmniejsza obciążenie.

<IfModule mod_headers.c>
  Header unset Set-Cookie
</IfModule>

11. Zarządzanie limitem połączeń (mod_ratelimit)

Ograniczanie liczby połączeń pozwala uniknąć przeciążenia serwera.

<IfModule mod_ratelimit.c>
  SetEnv rate-limit 400
</IfModule>

12. Blokowanie niepotrzebnych żądań (mod_security)

Blokowanie niepotrzebnych żądań, takich jak zbędne boty, zmniejsza obciążenie serwera.

<IfModule mod_security.c>
  SecFilterEngine On
  SecFilterScanPOST On
  SecRuleEngine On
</IfModule>

13. Kompresja Brotli (mod_brotli)

Alternatywą dla GZIP jest kompresja Brotli, która może jeszcze bardziej zmniejszyć rozmiar plików.

<IfModule mod_brotli.c>
  AddOutputFilterByType BROTLI_COMPRESS text/html text/plain text/xml
  AddOutputFilterByType BROTLI_COMPRESS text/css
  AddOutputFilterByType BROTLI_COMPRESS text/javascript
  AddOutputFilterByType BROTLI_COMPRESS application/javascript
  AddOutputFilterByType BROTLI_COMPRESS application/x-javascript
  AddOutputFilterByType BROTLI_COMPRESS application/xml
  AddOutputFilterByType BROTLI_COMPRESS application/xhtml+xml
</IfModule>

14. HTTP/2 (mod_http2)

Jeśli serwer obsługuje HTTP/2, możesz skonfigurować plik .htaccess, aby wymusić jego użycie, co przyspiesza komunikację między serwerem a przeglądarką.

<IfModule mod_http2.c>
  Protocols h2 http/1.1
</IfModule>

15. Wyeliminowanie blokujących zasobów (async dla JS i CSS)

Aby skrypty JavaScript i CSS nie blokowały ładowania strony, możesz użyć atrybutu async dla zasobów zewnętrznych.

<IfModule mod_headers.c>
  Header set Link "</path/to/resource.js>; rel=preload; as=script"
</IfModule>

16. Kontrola nad rozmiarem plików przesyłanych na serwer (mod_security, mod_request)

Ograniczenie rozmiaru plików przesyłanych na serwer może zapobiec przeciążeniom.

<IfModule mod_request.c>
  LimitRequestBody 10485760  # Ograniczenie przesyłanych plików do 10MB
</IfModule>

17. Kontrola nad połączeniami Keep-Alive (mod_headers)

Optymalizacja połączeń Keep-Alive może skrócić czas oczekiwania na kolejne żądania HTTP.

<IfModule mod_headers.c>
  Header set Keep-Alive "timeout=5, max=100"
</IfModule>

18. Wymuszenie kompresji statycznych plików HTML/CSS/JS (mod_filter)

Dodanie warunkowych filtrów dla kompresji wyłącznie dla określonych typów MIME może pomóc w optymalizacji działania serwera.

<IfModule mod_filter.c>
  FilterDeclare compress
  FilterProvider compress DEFLATE "%{Content_Type} = 'text/html'"
  FilterProvider compress DEFLATE "%{Content_Type} = 'text/css'"
  FilterProvider compress DEFLATE "%{Content_Type} = 'application/javascript'"
  FilterChain compress
</IfModule>

19. Zarządzanie kolejnością ładowania zasobów zewnętrznych (mod_rewrite)

Zmiana kolejności ładowania zasobów, takich jak zewnętrzne skrypty i style, może przyspieszyć renderowanie strony.

<IfModule mod_rewrite.c>
  # Optymalizacja ładowania zasobów zewnętrznych
  RewriteCond %{REQUEST_URI} ^/path/to/resource$
  RewriteRule ^(.*)$ https://external-site.com/resource.js [L]
</IfModule>

20. Ustawienie priorytetów HTTP/2 dla zasobów (mod_http2)

Jeśli korzystasz z HTTP/2, możesz ustawić priorytety dla konkretnych zasobów, aby przyspieszyć ładowanie tych najważniejszych.

<IfModule mod_http2.c>
  H2PushResource /css/styles.css
  H2PushResource /js/script.js
</IfModule>

21. Blokowanie określonych User-Agentów lub botów (mod_rewrite, mod_headers)

Niektóre boty lub agenty użytkownika mogą obciążać serwer. Możesz je blokować, aby odciążyć serwer.

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTP_USER_AGENT} ^.*(BadBot|EvilScraper|BotExample).*$ [NC]
  RewriteRule .* - [F,L]
</IfModule>

22. Ustawienie nagłówków CORS (Cross-Origin Resource Sharing) dla przyspieszenia ładowania zasobów z zewnętrznych domen

CORS pozwala na bezpieczne udostępnianie zasobów między różnymi domenami, co może przyspieszyć ładowanie zewnętrznych zasobów.

<IfModule mod_headers.c>
  Header set Access-Control-Allow-Origin "*"
  Header set Access-Control-Allow-Methods "GET, OPTIONS"
  Header set Access-Control-Allow-Headers "X-Requested-With"
</IfModule>

23. Optymalizacja liczby wątków (mod_worker)

Jeśli Twój serwer działa na MPM Worker, możesz zoptymalizować liczbę wątków obsługujących żądania, aby poprawić wydajność przy dużym obciążeniu.

<IfModule mpm_worker_module>
  StartServers 4
  MinSpareThreads 25
  MaxSpareThreads 75
  ThreadLimit 64
  ThreadsPerChild 25
  MaxRequestWorkers 150
</IfModule>

24. Dynamiczne ustawianie zmiennej serwera dla różnych żądań (mod_setenvif)

Dzięki mod_setenvif możesz dynamicznie dostosowywać zmienne serwera w zależności od typu żądań.

<IfModule mod_setenvif.c>
  SetEnvIf Request_URI "\.css$" css_request
  SetEnvIf Request_URI "\.js$" js_request
</IfModule>

25. Ograniczenie liczby jednoczesnych połączeń dla IP (mod_limitipconn)

Ograniczanie liczby jednoczesnych połączeń dla jednego adresu IP może zmniejszyć obciążenie serwera.

<IfModule mod_limitipconn.c>
  MaxConnPerIP 10
</IfModule>

26. Ochrona przed atakami DDoS (mod_evasive)

mod_evasive pomaga chronić serwer przed atakami DDoS, co może wpłynąć na dostępność i szybkość strony.

<IfModule mod_evasive20.c>
  DOSHashTableSize 3097
  DOSPageCount 2
  DOSSiteCount 50
  DOSBlockingPeriod 10
</IfModule>

27. Obsługa żądań POST i GET (mod_alias)

Ustawienie odpowiednich reguł dla obsługi różnych metod HTTP może poprawić wydajność.

<IfModule mod_alias.c>
  RedirectMatch 301 /old-path/ https://example.com/new-path/
</IfModule>

28. Zarządzanie rozmiarem pamięci podręcznej FastCGI (mod_proxy_fcgi)

W kontekście serwerów FastCGI możesz zarządzać pamięcią podręczną, aby zwiększyć wydajność.

<IfModule mod_proxy_fcgi.c>
  ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/html/\
</IfModule>

29. LimitRequestFields i LimitRequestFieldSize (mod_limit)

Te dyrektywy ograniczają liczbę i rozmiar nagłówków w żądaniach HTTP, co może zapobiec przeciążeniu serwera.

<IfModule mod_limit.c>
  LimitRequestFields 100  # Maksymalna liczba nagłówków
  LimitRequestFieldSize 8190  # Maksymalny rozmiar pojedynczego nagłówka (w bajtach)
</IfModule>

30. Timeout

Dyrektywa Timeout pozwala na ustawienie maksymalnego czasu oczekiwania serwera na odpowiedź. Zmniejszenie tej wartości może pomóc w optymalizacji zasobów.

Timeout 30  # Serwer będzie czekał maksymalnie 30 sekund na odpowiedź

31. MaxKeepAliveRequests

Określa maksymalną liczbę żądań HTTP, jakie przeglądarka może wykonać podczas jednego połączenia Keep-Alive. Zwiększenie tej wartości może skrócić czas ładowania stron z dużą ilością zasobów.

MaxKeepAliveRequests 100  # Domyślnie ustawiona na 100 żądań

32. KeepAliveTimeout

Czas (w sekundach), przez jaki serwer czeka na kolejne żądanie od tego samego klienta przed zamknięciem połączenia Keep-Alive. Zmniejszenie tej wartości może poprawić wydajność w środowiskach o dużym ruchu.

KeepAliveTimeout 5  # Czas oczekiwania na kolejne żądanie to 5 sekund

33. LimitRequestLine

Ogranicza maksymalną długość linii żądania HTTP (np. długość URL). Może pomóc w zabezpieczeniu przed atakami DDoS oraz optymalizacji.

<IfModule mod_limit.c>
  LimitRequestLine 8190  # Domyślna maksymalna długość linii żądania HTTP
</IfModule>

34. BufferSize (mod_buffer)

Ustawienia buforowania wpływają na sposób przesyłania danych pomiędzy serwerem a klientem, co może zoptymalizować wydajność przesyłania dużych plików.

<IfModule mod_buffer.c>
  BufferSize 4096  # Ustawia rozmiar bufora na 4096 bajtów
</IfModule>

35. ProxyTimeout (mod_proxy)

Dyrektywa ProxyTimeout określa czas oczekiwania na odpowiedź od serwera proxy. Zmniejszenie wartości może pomóc w wydajności, gdy korzystasz z serwera proxy do dostarczania zasobów.

<IfModule mod_proxy.c>
  ProxyTimeout 60  # Ustawia limit na 60 sekund
</IfModule>

36. No compression for already compressed files (mod_setenvif)

Unikaj ponownej kompresji plików, które są już skompresowane (np. plików .zip, .png itp.).

<IfModule mod_setenvif.c>
  SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|zip|gz)$ no-gzip dont-vary
</IfModule>

37. Multi-Processing Module (MPM) Configurations

W zależności od wersji serwera Apache, możesz używać różnych MPM (Multi-Processing Module) do optymalizacji równoczesnych połączeń. Przykłady obejmują mpm_prefork, mpm_worker i mpm_event. Optymalizacja tych ustawień może znacząco poprawić wydajność serwera.

a) mpm_prefork dla nie-wielowątkowych aplikacji:

<IfModule mpm_prefork_module>
  StartServers 5
  MinSpareServers 5
  MaxSpareServers 10
  MaxRequestWorkers 150
  MaxConnectionsPerChild 3000
</IfModule>

b) mpm_worker dla wielowątkowych aplikacji:

<IfModule mpm_worker_module>
  StartServers 3
  MinSpareThreads 75
  MaxSpareThreads 250
  ThreadLimit 64
  ThreadsPerChild 25
  MaxRequestWorkers 400
  MaxConnectionsPerChild 0
</IfModule>

c) mpm_event dla optymalizacji wydajności w środowiskach o dużym ruchu:

<IfModule mpm_event_module>
  StartServers 2
  MinSpareThreads 25
  MaxSpareThreads 75
  ThreadLimit 64
  ThreadsPerChild 25
  MaxRequestWorkers 150
  MaxConnectionsPerChild 1000
</IfModule>

38. Disable Directory Browsing

Wyłączenie przeglądania katalogów może nie tylko poprawić bezpieczeństwo, ale także minimalnie zwiększyć wydajność, ponieważ serwer nie musi generować widoku katalogów.

Options -Indexes

39. Timeout dla operacji CGI (mod_cgi)

Jeśli używasz skryptów CGI, możesz ustawić limit czasu ich wykonywania, co może pomóc w optymalizacji zasobów.

<IfModule mod_cgi.c>
  ScriptTimeout 60  # Ustawia limit na 60 sekund
</IfModule>

40. Zmniejszenie wielkości dzienników (mod_log_config)

Ograniczenie zapisywania dzienników serwera może zmniejszyć obciążenie serwera przy dużym ruchu.

<IfModule mod_log_config.c>
  CustomLog /dev/null common
</IfModule>

41. ModSecurity Tuning (mod_security)

Jeśli używasz ModSecurity, możesz go skonfigurować, aby filtrować tylko określone typy żądań, co zmniejszy obciążenie serwera.

<IfModule mod_security.c>
  SecRuleEngine On
  SecRequestBodyAccess Off  # Wyłączenie skanowania treści POST
</IfModule>

42. Disable TRACE and TRACK HTTP methods (mod_rewrite)

Wyłączenie metod TRACE i TRACK może poprawić bezpieczeństwo oraz wydajność serwera, eliminując niepotrzebne żądania.

RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* - [F]

43. Limitowanie dostępu do zasobów (mod_access)

Jeśli niektóre zasoby są dostępne tylko dla wybranych użytkowników, możesz ograniczyć dostęp do nich za pomocą IP, co zmniejszy obciążenie serwera.

<IfModule mod_access.c>
  Order Deny,Allow
  Deny from all
  Allow from 192.168.1.100
</IfModule>

Każda strona internetowa ma unikalne wymagania i specyfikę, dlatego nie wszystkie dyrektywy .htaccess są odpowiednie w każdym przypadku. Optymalizacja szybkości strony powinna być przeprowadzana z rozwagą i dostosowana do konkretnego środowiska serwera oraz charakterystyki ruchu. Wdrożenie zbyt wielu niepotrzebnych dyrektyw może prowadzić do niezamierzonych skutków, takich jak spadek wydajności lub problemy z kompatybilnością. Zamiast ślepo wdrażać wszystkie dostępne opcje, warto przeanalizować konkretne potrzeby strony i stopniowo wprowadzać odpowiednie optymalizacje, monitorując ich wpływ na działanie serwisu.

0 komentarzy