{"id":20021,"date":"2026-06-15T08:34:43","date_gmt":"2026-06-15T06:34:43","guid":{"rendered":"https:\/\/webhosting.de\/http-conditional-caching-etag-last-modified-performance-guide\/"},"modified":"2026-06-15T08:34:43","modified_gmt":"2026-06-15T06:34:43","slug":"buforowanie-warunkowe-http-etag-data-ostatniej-modyfikacji-przewodnik-dotyczacy-wydajnosci","status":"publish","type":"post","link":"https:\/\/webhosting.de\/pl\/http-conditional-caching-etag-last-modified-performance-guide\/","title":{"rendered":"Zrozumienie buforowania warunkowego HTTP z wykorzystaniem ETag i Last-Modified"},"content":{"rendered":"<p>Buforowanie HTTP pozwala zaoszcz\u0119dzi\u0107 czas i transfer danych, poniewa\u017c zasoby s\u0105 ponownie \u0142adowane tylko wtedy, gdy faktycznie uleg\u0142y zmianie. Poprzez <strong>ETag<\/strong> oraz <strong>Ostatnio zmodyfikowany<\/strong> Sprawdzam za pomoc\u0105 zapytania warunkowego, czy serwer odpowiada kodem 304 Not Modified, co znacznie zmniejsza obci\u0105\u017cenie sieci i serwera.<\/p>\n\n<h2>Punkty centralne<\/h2>\n\n<p>Poni\u017csze kluczowe tezy pokazuj\u0105, na co zwracam uwag\u0119 podczas stosowania buforowania warunkowego z <strong>ETag<\/strong> oraz <strong>Ostatnio zmodyfikowany<\/strong> uwaga.<\/p>\n<ul>\n  <li><strong>Mniejszy ruch<\/strong>: W przypadku niezmienionych plik\u00f3w zwracany jest kod 304, a nie ca\u0142a tre\u015b\u0107 \u2013 co zauwa\u017calnie zmniejsza ilo\u015b\u0107 przesy\u0142anych danych i op\u00f3\u017anienie.<\/li>\n  <li><strong>Lepsza wydajno\u015b\u0107<\/strong>: Kr\u00f3tszy czas oczekiwania poprawia komfort u\u017cytkowania (UX) oraz wska\u017aniki Core Web Vitals, co <strong>SEO<\/strong> pomaga.<\/li>\n  <li><strong>Dwa mechanizmy<\/strong>: Nag\u0142\u00f3wki Last-Modified\/If-Modified-Since oraz ETag\/If-None-Match zapewniaj\u0105 bezpieczn\u0105 weryfikacj\u0119 zawarto\u015bci pami\u0119ci podr\u0119cznej.<\/li>\n  <li><strong>Kontrola pami\u0119ci podr\u0119cznej<\/strong>: Dyrektywy reguluj\u0105 aktualizacj\u0119, od\u015bwie\u017canie i zachowanie w pami\u0119ciach podr\u0119cznych po\u015brednich.<\/li>\n  <li><strong>Po\u0142\u0105czenie<\/strong>: Oba metody razem zapewniaj\u0105 wysok\u0105 dok\u0142adno\u015b\u0107 i proste rozwi\u0105zania awaryjne.<\/li>\n<\/ul>\n<p>Najpierw sprawdzam, kt\u00f3re zasoby zmieniaj\u0105 si\u0119 naprawd\u0119 cz\u0119sto, a kt\u00f3re rzadko. W przypadku plik\u00f3w rzadko modyfikowanych ustawiam <strong>Ostatnio zmodyfikowany<\/strong>-czas i dodaj\u0119 ETag. W przypadku odpowiedzi dynamicznych najch\u0119tniej korzystam z <strong>ETag<\/strong>, poniewa\u017c ka\u017cda zmiana tre\u015bci jest natychmiast widoczna. W ten spos\u00f3b odci\u0105\u017cam serwery, zmniejszam op\u00f3\u017anienia i zapewniam powracaj\u0105cym u\u017cytkownikom bardzo szybkie \u0142adowanie stron. Strategia ta wzmacnia <strong>Core Web Vitals<\/strong> a tym samym po\u015brednio widoczno\u015b\u0107.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/06\/conditional-caching-8923.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Buforowanie warunkowe HTTP: jak sprawdzi\u0107 wa\u017cno\u015b\u0107<\/h2>\n\n<p>Przy ponownym wywo\u0142aniu klient wysy\u0142a opr\u00f3cz \u017c\u0105dania GET dodatkowe nag\u0142\u00f3wki, kt\u00f3re analizuj\u0119 po stronie serwera. Je\u015bli zas\u00f3b ma ten sam <strong>ETag<\/strong> Je\u015bli zawarto\u015b\u0107 jest taka sama jak w pami\u0119ci podr\u0119cznej (If-None-Match), zwracam kod 304 Not Modified bez tre\u015bci. Je\u015bli znacznik czasu nie uleg\u0142 zmianie (If-Modified-Since), serwer r\u00f3wnie\u017c odpowiada kodem 304. Je\u015bli dzie\u0144 lub data s\u0105 nieprawid\u0142owe, wysy\u0142am 200 OK z now\u0105 tre\u015bci\u0105 oraz zaktualizowanym <strong>Ostatnio zmodyfikowany<\/strong> oraz ETag. Dzi\u0119ki temu oszcz\u0119dzam przepustowo\u015b\u0107, aktualizuj\u0119 pami\u0119\u0107 podr\u0119czn\u0105 i zapewniam zauwa\u017calnie szybsze \u0142adowanie stron.<\/p>\n\n<h2>Last-Modified i If-Modified-Since w codziennym u\u017cytkowaniu<\/h2>\n\n<p>Nag\u0142\u00f3wek <strong>Ostatnio zmodyfikowany<\/strong> U\u017cywam rzeczywistej daty modyfikacji pliku, na przyk\u0142ad z systemu plik\u00f3w. Je\u015bli p\u00f3\u017aniej nadejdzie \u017c\u0105danie z nag\u0142\u00f3wkiem `If-Modified-Since`, a zas\u00f3b nie uleg\u0142 od tego czasu zmianie, odpowiadam kodem 304. To rozwi\u0105zanie jest proste, \u0142atwe do zrozumienia i idealne dla zasob\u00f3w statycznych, takich jak CSS, JS czy obrazy. Ograniczenia wynikaj\u0105 z sekundowej siatki znacznik\u00f3w czasu HTTP oraz sytuacji, w kt\u00f3rych tre\u015bci zmieniaj\u0105 si\u0119 logicznie, ale nie istnieje jednoznaczny moment modyfikacji pliku. Tam, gdzie Last-Modified osi\u0105ga swoje granice, uzupe\u0142nia go <strong>ETag<\/strong> kontrola.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/06\/meeting_http_caching_4573.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>ETag i If-None-Match w systemach dynamicznych<\/h2>\n\n<p>A <strong>ETag<\/strong> Generuj\u0119 go jako skr\u00f3t, identyfikator wersji lub na podstawie kolumny bazy danych, kt\u00f3ra odzwierciedla zmiany stanu. Przy ponownym dost\u0119pie przegl\u0105darka wysy\u0142a If-None-Match, por\u00f3wnuj\u0119 tag z moj\u0105 aktualn\u0105 warto\u015bci\u0105 i odpowiadam odpowiednio 304 lub 200. To por\u00f3wnanie wykrywa ka\u017cd\u0105 znacz\u0105c\u0105 zmian\u0119 tre\u015bci, bez polegania na znacznikach czasu plik\u00f3w. Daje to bardzo dok\u0142adne wyniki, zw\u0142aszcza w przypadku interfejs\u00f3w API, stron z\u0142o\u017conych lub spersonalizowanych fragment\u00f3w. Wa\u017cne jest, aby zachowa\u0107 sp\u00f3jno\u015b\u0107 ETag\u00f3w w \u015brodowiskach klastrowych, tak aby \u017caden serwer nie przypisa\u0142 przypadkowo innego <strong>Dzie\u0144<\/strong> wyprodukowane.<\/p>\n\n<h2>W\u0142a\u015bciwe \u0142\u0105czenie ustawie\u0144 Cache-Control<\/h2>\n\n<p>Z <strong>Kontrola pami\u0119ci podr\u0119cznej<\/strong> Okre\u015blam, jak d\u0142ugo tre\u015bci s\u0105 uznawane za aktualne bez ponownego sprawdzania oraz kiedy przegl\u0105darka przeprowadza ponown\u0105 weryfikacj\u0119. Ustawiam odpowiednie warto\u015bci max-age w zale\u017cno\u015bci od cz\u0119stotliwo\u015bci zmian i stosuj\u0119 atrybut must-revalidate, gdy nieaktualne dane mog\u0142yby mie\u0107 krytyczne znaczenie. W przypadku plik\u00f3w z numerami wersji odpowiedni jest d\u0142ugi okres wa\u017cno\u015bci, podczas gdy cz\u0119sto zmieniaj\u0105ce si\u0119 odpowiedzi maj\u0105 kr\u00f3tszy okres wa\u017cno\u015bci i mo\u017cna je wtedy dok\u0142adnie sprawdzi\u0107 za pomoc\u0105 ETag lub daty. W ten spos\u00f3b \u0142\u0105cz\u0119 kr\u00f3tkie czasy odpowiedzi z prawid\u0142ow\u0105 aktualno\u015bci\u0105. Je\u015bli chcesz zg\u0142\u0119bi\u0107 ten temat, znajdziesz wiele przyk\u0142ad\u00f3w pod adresem <a href=\"https:\/\/webhosting.de\/pl\/strategie-kontroli-pamieci-podrecznej-http-hosting-cachemaster\/\">Strategie kontroli pami\u0119ci podr\u0119cznej<\/a>, z kt\u00f3rych korzystam w praktyce.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/06\/http-caching-etag-concept-3892.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Przebieg operacji Conditional GET krok po kroku<\/h2>\n\n<p>Przy pierwszym \u017c\u0105daniu serwer wysy\u0142a odpowied\u017a 200 OK wraz z nag\u0142\u00f3wkiem Cache-Control, <strong>Ostatnio zmodyfikowany<\/strong> oraz ETag, a przegl\u0105darka zapisuje te dane. Podczas kolejnej wizyty to w\u0142a\u015bnie wiek w pami\u0119ci podr\u0119cznej decyduje o tym, czy konieczna jest ponowna weryfikacja. Je\u015bli jest ona wymagana, przegl\u0105darka wysy\u0142a \u017c\u0105danie z nag\u0142\u00f3wkami If-None-Match i\/lub If-Modified-Since. Je\u015bli warto\u015bci s\u0105 zgodne z aktualnym stanem, wysy\u0142am 304 Not Modified, a klient nadal korzysta ze swojej pami\u0119ci podr\u0119cznej. Je\u015bli nie s\u0105 ju\u017c zgodne, nast\u0119puje 200 OK z now\u0105 tre\u015bci\u0105 i zaktualizowanymi <strong>Dane walidacyjne<\/strong>.<\/p>\n\n<h2>Por\u00f3wnanie: ETag a Last-Modified<\/h2>\n\n<p>Obie metody zapewniaj\u0105 mi kontrol\u0119, r\u00f3\u017cni\u0105 si\u0119 jednak pod wzgl\u0119dem nak\u0142adu pracy, dok\u0142adno\u015bci i przydatno\u015bci. <strong>Ostatnio zmodyfikowany<\/strong> Wyr\u00f3\u017cnia si\u0119 prostot\u0105 wdro\u017cenia i przejrzyst\u0105 semantyk\u0105, o ile dysponuj\u0119 poprawnymi znacznikami czasu. ETag bardzo dok\u0142adnie odzwierciedla zawarto\u015b\u0107, ale jego generowanie wymaga nieco logiki. W wielu konfiguracjach \u0142\u0105cz\u0119 oba rozwi\u0105zania, czerpi\u0105c w ten spos\u00f3b korzy\u015bci z prostoty oraz dok\u0142adnego rozpoznawania. Poni\u017csza tabela podsumowuje typowe cechy i pomaga w podj\u0119ciu decyzji.<\/p>\n\n<table>\n  <thead>\n    <tr>\n      <th><strong>Aspekt<\/strong><\/th>\n      <th><strong>Ostatnio zmodyfikowany<\/strong><\/th>\n      <th><strong>ETag<\/strong><\/th>\n      <th><strong>Wskaz\u00f3wka<\/strong><\/th>\n    <\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td>To\u017csamo\u015b\u0107<\/td>\n      <td>Data ostatniej zmiany<\/td>\n      <td>Skr\u00f3t tre\u015bci lub identyfikator wersji<\/td>\n      <td><strong>Czas<\/strong> vs. identyfikator oparty na tre\u015bci<\/td>\n    <\/tr>\n    <tr>\n      <td>Wykrywanie zmian<\/td>\n      <td>Rozdzielczo\u015b\u0107 w sekundach, po\u015brednia<\/td>\n      <td>Skupia si\u0119 bezpo\u015brednio na tre\u015bci<\/td>\n      <td>ETag wykrywa najmniejsze <strong>R\u00f3\u017cnice<\/strong><\/td>\n    <\/tr>\n    <tr>\n      <td>wdro\u017cenie<\/td>\n      <td>Bardzo lekki, wystarczy system plik\u00f3w<\/td>\n      <td>Wymaga tworzenia i sp\u00f3jno\u015bci<\/td>\n      <td>Klastry potrzebuj\u0105 jednakowych <strong>ETags<\/strong><\/td>\n    <\/tr>\n    <tr>\n      <td>U\u017cycie<\/td>\n      <td>Elementy statyczne<\/td>\n      <td>Odpowiedzi dynamiczne<\/td>\n      <td>To po\u0142\u0105czenie obejmuje wiele <strong>Przypadki<\/strong> z<\/td>\n    <\/tr>\n    <tr>\n      <td>Odpowiedzi<\/td>\n      <td>304 przy niezmienionym znaczniku czasu<\/td>\n      <td>304 przy identycznym tagu<\/td>\n      <td>200 w przypadku zmian z nowym <strong>Warto\u015b\u0107<\/strong><\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/06\/tech_office_caching_4721.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>W praktyce: wydajne dostarczanie zasob\u00f3w statycznych<\/h2>\n\n<p>Pliki statyczne, takie jak CSS, JS i obrazy, rzadko ulegaj\u0105 zmianom i nadaj\u0105 si\u0119 do d\u0142ugotrwa\u0142ego <strong>maksymalny wiek<\/strong>-Czas. W przypadku plik\u00f3w z wersjami ustawiam d\u0142ugie okresy, nawet do roku, i oznaczam je jako niezmienne, aby przegl\u0105darka \u0142adowa\u0142a je bez dodatkowych zapyta\u0144. W przypadku zasob\u00f3w bez wersji wybieram kr\u00f3tsze terminy i polegam na ponownej walidacji za pomoc\u0105 ETag i Last-Modified. W ten spos\u00f3b unikam nieaktualnych tre\u015bci i ograniczam ruch. Zwracam uwag\u0119, aby nie <a href=\"https:\/\/webhosting.de\/pl\/http-cache-headers-sabotieren-caching-cachefix\/\">Sabotowanie nag\u0142\u00f3wka pami\u0119ci podr\u0119cznej<\/a> dzi\u0119ki temu uzyskuj\u0119 wysoki wska\u017anik trafie\u0144 w pami\u0119ci podr\u0119cznej.<\/p>\n\n<h2>W praktyce: interfejsy API i strony dynamiczne<\/h2>\n\n<p>Je\u015bli chodzi o interfejsy API, zazwyczaj stawiam na <strong>ETags<\/strong>, kt\u00f3ry tworz\u0119 na podstawie wynik\u00f3w w formacie sekwencyjnym lub kolumny wersji. Je\u015bli rekord ulegnie zmianie, generuj\u0119 nowy tag, a klienci natychmiast to rozpoznaj\u0105. W przypadku tre\u015bci o niepewnym znaczniku czasu cz\u0119sto rezygnuj\u0119 z Last-Modified, aby nie powsta\u0142o fa\u0142szywe wra\u017cenie aktualno\u015bci. Dodatkowo kontroluj\u0119 czas \u017cycia za pomoc\u0105 Cache-Control i wymuszam ponown\u0105 walidacj\u0119 po up\u0142ywie tego czasu. W ten spos\u00f3b niezawodnie utrzymuj\u0119 dane w aktualnym stanie, nie zwi\u0119kszaj\u0105c niepotrzebnie rozmiaru odpowiedzi.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/06\/developer_desk_caching_3947.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Testowanie i monitorowanie wsp\u00f3\u0142czynnika trafie\u0144 w pami\u0119ci podr\u0119cznej<\/h2>\n\n<p>Sprawdzam nag\u0142\u00f3wki, takie jak <strong>ETag<\/strong>, Last-Modified, If-None-Match i If-Modified-Since w narz\u0119dziach programistycznych. Zwracam przy tym uwag\u0119 na kody odpowiedzi, zw\u0142aszcza 304 w por\u00f3wnaniu z 200, aby sprawdzi\u0107 skuteczno\u015b\u0107 mojej ponownej walidacji. Je\u015bli kod 304 pojawia si\u0119 rzadko, dostosowuj\u0119 ustawienia Cache-Control, okresy wa\u017cno\u015bci i generowanie ETag. Logi i metryki pokazuj\u0105 mi, kt\u00f3re \u015bcie\u017cki generuj\u0105 niepotrzebnie du\u017ce odpowiedzi. W celu wprowadzenia zbiorczych ulepsze\u0144 ch\u0119tnie korzystam z <a href=\"https:\/\/webhosting.de\/pl\/pakiet-optymalizacji-walidacji-pamieci-podrecznej-zadan-warunkowych-http\/\">Pakiet Conditional-Requests<\/a>, kt\u00f3re \u0142\u0105czy konfiguracj\u0119 i testy.<\/p>\n\n<h2>Architektura hostingu i pu\u0142apki ETag<\/h2>\n\n<p>W konfiguracjach z wieloma serwerami nale\u017cy <strong>ETag<\/strong> musi by\u0107 niezale\u017cny od instancji, w przeciwnym razie rozpoznawanie nie zadzia\u0142a. Dbam o to, aby wszystkie w\u0119z\u0142y stosowa\u0142y t\u0119 sam\u0105 logik\u0119 i ten sam klucz do generowania. Serwery proxy odwrotne lub sieci CDN nie mog\u0105 modyfikowa\u0107 etag\u00f3w i powinny poprawnie przekazywa\u0107 nag\u0142\u00f3wki warunkowe. W przypadku wdro\u017ce\u0144 z odciskami palc\u00f3w zasob\u00f3w unikam ponownego obliczania ETag\u00f3w po stronie serwera, je\u015bli plik ma ju\u017c adres URL z wersj\u0105. Sp\u00f3jne zasady zapobiegaj\u0105 niesp\u00f3jnym odpowiedziom i utrzymuj\u0105 wysoki wska\u017anik trafie\u0144 w pami\u0119ci podr\u0119cznej.<\/p>\n\n<h2>\u015awie\u017co\u015b\u0107 a walidacja: precyzyjne stosowanie dyrektyw<\/h2>\n\n<p>Dokonuj\u0119 wyra\u017anego rozr\u00f3\u017cnienia mi\u0119dzy <em>\u015awie\u017co\u015b\u0107<\/em> (jak d\u0142ugo cache mo\u017ce korzysta\u0107 z kopii bez ponownego sprawdzania?) oraz <em>Walidacja<\/em> (jak sprawdzi\u0107, czy jest nadal wa\u017cna?). O <strong>Kontrola pami\u0119ci podr\u0119cznej<\/strong> reguluj\u0119 oba elementy z du\u017c\u0105 precyzj\u0105: <strong>maksymalny wiek<\/strong> okre\u015bla czas \u017cycia obiektu po stronie klienta, <strong>s-maxage<\/strong> dla pami\u0119ci podr\u0119cznych wsp\u00f3\u0142dzielonych, takich jak serwery proxy. <strong>publiczny<\/strong> umo\u017cliwia buforowanie w podzielonych pami\u0119ciach podr\u0119cznych, <strong>prywatny<\/strong> ogranicza to do przegl\u0105darki docelowej. <strong>musisz ponownie potwierdzi\u0107<\/strong> wymusza wys\u0142anie zapytania po up\u0142ywie czasu, podczas gdy <strong>niezmienny<\/strong> zapobiega niepotrzebnym ponownym walidacjom w przypadku zasob\u00f3w z numerami wersji. <strong>no-cache<\/strong> nie zabrania buforowania, ale wymaga zawsze ponownej walidacji; <strong>no-store<\/strong> natomiast ca\u0142kowicie zabrania zapisywania. Starsze <strong>Wygasa<\/strong>- Nag\u0142\u00f3wki u\u017cywam tylko jako rozwi\u0105zanie awaryjne, logik\u0119 konsekwentnie przenosz\u0119 do Cache-Control. A je\u015bli chc\u0119 z\u0142agodzi\u0107 skutki awarii, pomagaj\u0105 <strong>stale-while-revalidate<\/strong> oraz <strong>stale-if-error<\/strong>, aby udost\u0119pnia\u0107 tre\u015bci, kt\u00f3rych wa\u017cno\u015b\u0107 wkr\u00f3tce wyga\u015bnie, podczas gdy w tle aktualizuj\u0119 stron\u0119 lub naprawiam b\u0142\u0119dy.<\/p>\n\n<h2>Silne i s\u0142abe ETag-i, kompresja i warianty<\/h2>\n\n<p>\u015awiadomie rozr\u00f3\u017cniam silne i s\u0142abe czynniki potwierdzaj\u0105ce. <strong>Silne znaczniki ETag<\/strong> rozpozna\u0107 dok\u0142adnie tak\u0105 sam\u0105 reprezentacj\u0119 bajtow\u0105 \u2013 idealne rozwi\u0105zanie, je\u015bli ja r\u00f3wnie\u017c <strong>\u017b\u0105dania zasi\u0119gu<\/strong> chce obs\u0142ugiwa\u0107 w spos\u00f3b wydajny. <strong>S\u0142abe znaczniki ETag<\/strong> (Przedrostek <code>W\/<\/code>) wystarcz\u0105, je\u015bli wystarczy zgodno\u015b\u0107 semantyczna, na przyk\u0142ad w przypadku niewielkich, nieistotnych zmian formatowania. Wa\u017cne jest post\u0119powanie z <strong>Kompresja<\/strong>: Je\u015bli dostarczam tre\u015bci zakodowane zar\u00f3wno w formacie gzip, jak i brotli, jeden tag ETag nie mo\u017ce obowi\u0105zywa\u0107 dla wszystkich wariant\u00f3w. Musz\u0119 albo utworzy\u0107 ten tag na podstawie nieskompresowanej wersji, albo dodatkowo ustawi\u0107 odpowiedni <strong>Vary: Accept-Encoding<\/strong>, lub generuj\u0119 sp\u00f3jne, ale r\u00f3\u017cne etagi ETag dla ka\u017cdego wariantu. W ten spos\u00f3b zapobiegam b\u0142\u0119dnym wynikom i odpowiedziom 200, kt\u00f3re w rzeczywisto\u015bci powinny by\u0107 304. W przypadku <strong>Je\u015bli-zakres<\/strong> \u0141\u0105cz\u0119 zapytania o zakres z walidatorem: je\u015bli ETag lub data s\u0105 zgodne, zwracam kod stanu 206 (Partial Content); w przeciwnym razie zwracam kod stanu 200 z pe\u0142n\u0105 tre\u015bci\u0105, aby klient mia\u0142 sp\u00f3jn\u0105 podstaw\u0119.<\/p>\n\n<h2>Doskona\u0142e opanowanie nag\u0142\u00f3wk\u00f3w Vary i negocjacji tre\u015bci<\/h2>\n\n<p>Gdy serwer dostarcza r\u00f3\u017cne reprezentacje w zale\u017cno\u015bci od wymaga\u0144, ustawiam <strong>R\u00f3\u017cne<\/strong> prawid\u0142owo. Typowymi przyk\u0142adami s\u0105 <strong>Akceptowane kodowanie<\/strong> (kompresja), <strong>Akceptuj j\u0119zyk<\/strong> (lokalizacja) lub konkretne flagi funkcji. Staram si\u0119 unika\u0107 u\u017cywania zmiennych nag\u0142\u00f3wk\u00f3w, takich jak <strong>Agent u\u017cytkownika<\/strong> a nawet <strong>Ciasteczko<\/strong> zmienia\u0107, bo to znacznie obni\u017ca wsp\u00f3\u0142czynnik trafie\u0144 w pami\u0119ci podr\u0119cznej. Tam, gdzie konieczna jest personalizacja, oznaczam odpowiedzi jako <strong>prywatny<\/strong> lub <strong>no-store<\/strong> i wyra\u017anie oddzielaj je od zasob\u00f3w, kt\u00f3re mo\u017cna buforowa\u0107 publicznie. Wa\u017cne: warianty maj\u0105 r\u00f3wnie\u017c wp\u0142yw na ETag \u2013 ka\u017cdy wariant wymaga w\u0142asnego, sp\u00f3jnego walidatora. W ten spos\u00f3b zapewniam, \u017ce przegl\u0105darki, serwery proxy i sieci CDN stosuj\u0105 t\u0119 sam\u0105 logik\u0119 i \u017caden wariant nie zostanie przypadkowo pomylony z innym.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/06\/httpcaching-verstehen-2638.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Zapytania warunkowe wykraczaj\u0105ce poza GET<\/h2>\n\n<p>\u017b\u0105dania warunkowe dzia\u0142aj\u0105 nie tylko podczas odczytu. W przypadku metod zapisuj\u0105cych u\u017cywam <strong>If-Match<\/strong> lub <strong>If-Unmodified-Since<\/strong>w celu <em>brakuj\u0105ce aktualizacje<\/em> zapobiec. Je\u015bli klient podczas operacji PUT lub DELETE poda ostatnio widziany ETag poprzez <strong>If-Match<\/strong> je\u015bli stan serwera jest nadal taki sam, wprowadzam zmian\u0119 \u2013 w przeciwnym razie odpowiadam <strong>412 Nie spe\u0142niono warunku wst\u0119pnego<\/strong>. Aby zapewni\u0107 dyscyplin\u0119 w\u015br\u00f3d klient\u00f3w, serwer mo\u017ce ponadto <strong>428 Wymagane spe\u0142nienie warunku wst\u0119pnego<\/strong> ustanowi\u0107. Do szybkich test\u00f3w bez modelu u\u017cywam <strong>HEAD<\/strong>, kt\u00f3ry zwraca te same nag\u0142\u00f3wki co \u017c\u0105danie GET; idealne rozwi\u0105zanie, gdy chc\u0119 przetestowa\u0107 metadane. A w przypadku <strong>304<\/strong>-W odpowiedzi ponownie podaj\u0119 wszystkie nag\u0142\u00f3wki istotne dla pami\u0119ci podr\u0119cznej (Cache-Control, ETag, Expires, Last-Modified), aby klient zaktualizowa\u0142 swoje metadane bez przesy\u0142ania tre\u015bci.<\/p>\n\n<h2>Bezpiecze\u0144stwo, ochrona danych i zgodno\u015b\u0107 z przepisami<\/h2>\n\n<p>Nie zapisuj\u0119 danych osobowych ani tre\u015bci wra\u017cliwych w publicznej pami\u0119ci podr\u0119cznej. W tym miejscu stosuj\u0119 <strong>Kontrola pami\u0119ci podr\u0119cznej: prywatna<\/strong> lub <strong>no-store<\/strong>, aby przegl\u0105darka lub \u017cadna instancja nie zapisywa\u0142a tre\u015bci. Nale\u017cy zachowa\u0107 ostro\u017cno\u015b\u0107 w przypadku kont u\u017cytkownik\u00f3w i pulpit\u00f3w nawigacyjnych: odpowiedzi zawieraj\u0105ce <strong>Ustaw plik cookie<\/strong> lub <strong>Autoryzacja<\/strong> nie mog\u0105 by\u0107 przypadkowo publiczne i podlegaj\u0105ce buforowaniu. Same ETag-i mog\u0105 zosta\u0107 wykorzystane jako narz\u0119dzie do \u015bledzenia, je\u015bli pozostaj\u0105 niezmienne przez d\u0142u\u017cszy czas. Radz\u0119 sobie z tym, aktywnie stosuj\u0105c walidatory tylko tam, gdzie buforowanie jest po\u017c\u0105dane, a w przypadku tras specyficznych dla u\u017cytkownika wy\u0142\u0105czam je lub ograniczam ich czas \u017cycia. W ten spos\u00f3b \u0142\u0105cz\u0119 wydajno\u015b\u0107 z wymogami ochrony danych.<\/p>\n\n<h2>Szczeg\u00f3\u0142y wdro\u017cenia i koszty zwi\u0105zane z wydajno\u015bci\u0105<\/h2>\n\n<p>Generowanie tagu ETag nie mo\u017ce by\u0107 dro\u017csze ni\u017c korzy\u015bci z tego p\u0142yn\u0105ce. W przypadku du\u017cych plik\u00f3w lub kosztownych renderowa\u0144 zapisuj\u0119 ten tag wraz z metadanymi (sum\u0105 kontroln\u0105 pliku, skr\u00f3tem kompilacji, baz\u0105 danych\u2014<em>wersja wiersza<\/em>) i nie generuj\u0119 go od nowa przy ka\u017cdym \u017c\u0105daniu. W przypadku stron z\u0142o\u017conych pomocna jest <em>Strategia tworzenia wersji<\/em>: Tworz\u0119 ETag z stabilnych cz\u0119\u015bciowych ETag\u00f3w (np. szablon, fragment danych, konfiguracja), tak aby niewielkie zmiany dawa\u0142y konkretn\u0105, ale powtarzaln\u0105 now\u0105 warto\u015b\u0107. W klastrach synchronizuj\u0119 logik\u0119 generowania w wsp\u00f3lnej bibliotece i sprawdzam j\u0105 w CI, aby \u017cadna instancja nie odbiega\u0142a od normy. W przypadku bardzo du\u017cych obiekt\u00f3w blob stosuj\u0119 szybkie sumy kontrolne (CRC64) lub zapisuj\u0119 skr\u00f3ty kompilacji zamiast generowa\u0107 skr\u00f3t tre\u015bci w locie. Tam, gdzie absolutna identyczno\u015b\u0107 bajt\u00f3w nie jest konieczna, wystarcz\u0105 <strong>s\u0142abe ETags<\/strong> jako pragmatyczny kompromis.<\/p>\n\n<h2>Najcz\u0119stsze b\u0142\u0119dy i sposoby ich unikania<\/h2>\n\n<ul>\n  <li><strong>Losowe ETag<\/strong>: Je\u015bli tagi s\u0105 generowane na nowo przy ka\u017cdym \u017c\u0105daniu, ka\u017cda ponowna walidacja jest bezsensowna. Dbam o to, by warto\u015bci by\u0142y deterministyczne i zmienia\u0142y si\u0119 tylko w przypadku rzeczywistych zmian.<\/li>\n  <li><strong>Nieprawid\u0142owe po\u0142\u0105czenie dyrektyw<\/strong>: <em>no-store<\/em> U\u017cywanie ETag nic nie daje \u2013 przegl\u0105darka i tak tego nie zapisuje. Wybieram sp\u00f3jne kombinacje, aby uzyska\u0107 po\u017c\u0105dane dzia\u0142anie.<\/li>\n  <li><strong>Nadmierna zmienno\u015b\u0107<\/strong>: Wariacje w polu \u201eVary\u201d lub \u201eUser-Agent\u201d powoduj\u0105 rozbicie pami\u0119ci podr\u0119cznej. Ograniczam u\u017cycie pola \u201eVary\u201d wy\u0142\u0105cznie do rzeczywistych zmian reprezentacji.<\/li>\n  <li><strong>Pu\u0142apki kompresyjne<\/strong>: Wsp\u00f3lny ETag dla gzip i br powoduje b\u0142\u0119dne wyniki. Prawid\u0142owo przypisuj\u0119 ETagi do konkretnych wariant\u00f3w i poprawnie ustawiam nag\u0142\u00f3wek Vary.<\/li>\n  <li><strong>Odchylenie czasu<\/strong>: Niedok\u0142adne zegary serwer\u00f3w zniekszta\u0142caj\u0105 warto\u015b\u0107 Last-Modified. Synchronizuj\u0119 \u017ar\u00f3d\u0142a czasu, aby nag\u0142\u00f3wek If-Modified-Since dzia\u0142a\u0142 poprawnie.<\/li>\n  <li><strong>Pomy\u0142ka zwi\u0105zana z atrybutem no-cache<\/strong>: Wielu rozumie to jako \u201enie buforowa\u0107\u201c. Chodzi jednak o \u201ezawsze od\u015bwie\u017ca\u0107\u201c. Aby wprowadzi\u0107 rzeczywisty zakaz, u\u017cywam <em>no-store<\/em>.<\/li>\n<\/ul>\n\n<h2>Rozwi\u0105zywanie problem\u00f3w, wska\u017aniki i przep\u0142ywy pracy<\/h2>\n\n<p>Aby przeprowadzi\u0107 diagnostyk\u0119, otwieram zak\u0142adk\u0119 \u201eSie\u0107\u201d: wszystko si\u0119 zgadza <strong>Kontrola pami\u0119ci podr\u0119cznej<\/strong>? Wyst\u0119puje podczas rehabilitacji <strong>304<\/strong> zamiast 200? Pasuje <strong>ETag<\/strong> oraz <strong>Ostatnio zmodyfikowany<\/strong> mi\u0119dzy zapytaniem a odpowiedzi\u0105? Sprawdzam <strong>R\u00f3\u017cne<\/strong>, aby sprawdzi\u0107, czy warianty zosta\u0142y poprawnie rozpoznane. W logach wy\u015bwietlam <em>Trafione\/chybione<\/em>- Wy\u015bwietlanie wsp\u00f3\u0142czynnik\u00f3w, wska\u017anik\u00f3w 304 oraz \u015bredniej wielko\u015bci odpowiedzi na \u015bcie\u017ck\u0119. Wraz ze wzrostem wska\u017anika 304 zazwyczaj zauwa\u017calnie maleje obj\u0119to\u015b\u0107 danych i czas TTFB. W testach obci\u0105\u017ceniowych symuluj\u0119 powtarzaj\u0105ce si\u0119 wywo\u0142ania, aby mierzy\u0107 koszty ponownej walidacji zamiast koszt\u00f3w transferu. W przypadku nieprawid\u0142owo\u015bci stopniowo eliminuj\u0119 czynniki zak\u0142\u00f3caj\u0105ce: Set-Cookie, zbyt rygorystyczne regu\u0142y Vary, sprzeczne nag\u0142\u00f3wki, takie jak Pragma. W ten spos\u00f3b szybko znajduj\u0119 w\u0105skie gard\u0142o, kt\u00f3re obni\u017ca wsp\u00f3\u0142czynnik trafie\u0144.<\/p>\n\n<h2>Service Worker jako dodatkowa warstwa pami\u0119ci podr\u0119cznej<\/h2>\n\n<p>Je\u015bli korzystam z service workera, traktuj\u0119 go jako dodatkow\u0105 warstw\u0119, a nie jako warstw\u0119 sprzeczn\u0105. Pozwalam mu obs\u0142ugiwa\u0107 te same <strong>Kontrola pami\u0119ci podr\u0119cznej<\/strong>-zwracaj uwag\u0119 na sygna\u0142y i \u0142\u0105cz strategie, takie jak <em>stale-while-revalidate<\/em> celowo z walidacj\u0105 HTTP za pomoc\u0105 ETag i Last-Modified. W trybie offline modu\u0142 roboczy mo\u017ce dostarcza\u0107 zasoby, kt\u00f3re w kr\u00f3tkim czasie sta\u0142y si\u0119 nieaktualne, a nast\u0119pnie ponownie je walidowa\u0107 w tle. Wa\u017cne jest, aby poprawnie przekazywa\u0142 nag\u0142\u00f3wki warunkowe, w przeciwnym razie trac\u0119 korzy\u015bci p\u0142yn\u0105ce z 304 na odcinku sieciowym. W ten spos\u00f3b r\u00f3wnie\u017c scenariusze PWA korzystaj\u0105 z prawid\u0142owego buforowania HTTP, zamiast omija\u0107 jego mechanizmy.<\/p>\n\n<h2>Wp\u0142yw SEO i Core Web Vitals<\/h2>\n\n<p>Ulepszanie szybkich odpowiedzi <strong>UX<\/strong> oraz sygna\u0142y u\u017cytkownik\u00f3w, co sprzyja pozycjonowaniu w wynikach wyszukiwania. Szczeg\u00f3lnie zyskuj\u0105 na tym powracaj\u0105cy u\u017cytkownicy, poniewa\u017c ich przegl\u0105darki pobieraj\u0105 wiele plik\u00f3w bezpo\u015brednio z pami\u0119ci podr\u0119cznej lub potwierdzaj\u0105 je za pomoc\u0105 kodu 304. To mniejsze op\u00f3\u017anienie pozytywnie wp\u0142ywa na wska\u017aniki FCP, LCP i TTFB, kt\u00f3re obni\u017cam dzi\u0119ki ukierunkowanej ponownej walidacji. Ponadto serwer oszcz\u0119dza czas obliczeniowy, kt\u00f3ry mog\u0119 wykorzysta\u0107 na obs\u0142ug\u0119 szczyt\u00f3w obci\u0105\u017cenia lub z\u0142o\u017conych \u017c\u0105da\u0144. W ten spos\u00f3b zachowuj\u0119 wysok\u0105 wydajno\u015b\u0107, a tre\u015bci s\u0105 dostarczane poprawnie i na czas.<\/p>\n\n<h2>Podsumowanie: M\u00f3j plan dzia\u0142ania<\/h2>\n\n<p>Polegam na jasnym <strong>Po\u0142\u0105czenie<\/strong> na podstawie Cache-Control, Last-Modified i ETag. W przypadku zasob\u00f3w statycznych wybieram d\u0142ugie okresy wa\u017cno\u015bci i zabezpieczam si\u0119 poprzez ponown\u0105 walidacj\u0119, je\u015bli pliki nie s\u0105 wersjonowane. W przypadku odpowiedzi dynamicznych generuj\u0119 solidne ETagi i dbam o sp\u00f3jno\u015b\u0107 klastr\u00f3w. Nast\u0119pnie sprawdzam za pomoc\u0105 narz\u0119dzi, metryk i log\u00f3w, czy kod 304 pojawia si\u0119 wystarczaj\u0105co cz\u0119sto, i dostosowuj\u0119 ustawienia. W ten spos\u00f3b zapewniam szybkie dostarczanie tre\u015bci, mniejsze obci\u0105\u017cenie serwer\u00f3w i lepsze wra\u017cenia u\u017cytkownika dzi\u0119ki skutecznej <strong>Buforowanie HTTP<\/strong>.<\/p>","protected":false},"excerpt":{"rendered":"<p>Dowiedz si\u0119, jak dzia\u0142a warunkowe buforowanie HTTP z wykorzystaniem ETag i Last-Modified, jak realizowana jest weryfikacja zawarto\u015bci pami\u0119ci podr\u0119cznej przegl\u0105darki oraz jak dzi\u0119ki temu zoptymalizowa\u0107 czas \u0142adowania stron, wykorzystanie przepustowo\u015bci i obci\u0105\u017cenie serwera.<\/p>","protected":false},"author":1,"featured_media":20014,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[834],"tags":[],"class_list":["post-20021","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-plesk-webserver-plesk-administration-anleitungen"],"acf":[],"_wp_attached_file":null,"_wp_attachment_metadata":null,"litespeed-optimize-size":null,"litespeed-optimize-set":null,"_elementor_source_image_hash":null,"_wp_attachment_image_alt":null,"stockpack_author_name":null,"stockpack_author_url":null,"stockpack_provider":null,"stockpack_image_url":null,"stockpack_license":null,"stockpack_license_url":null,"stockpack_modification":null,"color":null,"original_id":null,"original_url":null,"original_link":null,"unsplash_location":null,"unsplash_sponsor":null,"unsplash_exif":null,"unsplash_attachment_metadata":null,"_elementor_is_screenshot":null,"surfer_file_name":null,"surfer_file_original_url":null,"envato_tk_source_kit":null,"envato_tk_source_index":null,"envato_tk_manifest":null,"envato_tk_folder_name":null,"envato_tk_builder":null,"envato_elements_download_event":null,"_menu_item_type":null,"_menu_item_menu_item_parent":null,"_menu_item_object_id":null,"_menu_item_object":null,"_menu_item_target":null,"_menu_item_classes":null,"_menu_item_xfn":null,"_menu_item_url":null,"_trp_menu_languages":null,"rank_math_primary_category":null,"rank_math_title":null,"inline_featured_image":null,"_yoast_wpseo_primary_category":null,"rank_math_schema_blogposting":null,"rank_math_schema_videoobject":null,"_oembed_049c719bc4a9f89deaead66a7da9fddc":null,"_oembed_time_049c719bc4a9f89deaead66a7da9fddc":null,"_yoast_wpseo_focuskw":null,"_yoast_wpseo_linkdex":null,"_oembed_27e3473bf8bec795fbeb3a9d38489348":null,"_oembed_c3b0f6959478faf92a1f343d8f96b19e":null,"_trp_translated_slug_en_us":null,"_wp_desired_post_slug":null,"_yoast_wpseo_title":null,"tldname":null,"tldpreis":null,"tldrubrik":null,"tldpolicylink":null,"tldsize":null,"tldregistrierungsdauer":null,"tldtransfer":null,"tldwhoisprivacy":null,"tldregistrarchange":null,"tldregistrantchange":null,"tldwhoisupdate":null,"tldnameserverupdate":null,"tlddeletesofort":null,"tlddeleteexpire":null,"tldumlaute":null,"tldrestore":null,"tldsubcategory":null,"tldbildname":null,"tldbildurl":null,"tldclean":null,"tldcategory":null,"tldpolicy":null,"tldbesonderheiten":null,"tld_bedeutung":null,"_oembed_d167040d816d8f94c072940c8009f5f8":null,"_oembed_b0a0fa59ef14f8870da2c63f2027d064":null,"_oembed_4792fa4dfb2a8f09ab950a73b7f313ba":null,"_oembed_33ceb1fe54a8ab775d9410abf699878d":null,"_oembed_fd7014d14d919b45ec004937c0db9335":null,"_oembed_21a029d076783ec3e8042698c351bd7e":null,"_oembed_be5ea8a0c7b18e658f08cc571a909452":null,"_oembed_a9ca7a298b19f9b48ec5914e010294d2":null,"_oembed_f8db6b27d08a2bb1f920e7647808899a":null,"_oembed_168ebde5096e77d8a89326519af9e022":null,"_oembed_cdb76f1b345b42743edfe25481b6f98f":null,"_oembed_87b0613611ae54e86e8864265404b0a1":null,"_oembed_27aa0e5cf3f1bb4bc416a4641a5ac273":null,"_oembed_time_27aa0e5cf3f1bb4bc416a4641a5ac273":null,"_tldname":null,"_tldclean":null,"_tldpreis":null,"_tldcategory":null,"_tldsubcategory":null,"_tldpolicy":null,"_tldpolicylink":null,"_tldsize":null,"_tldregistrierungsdauer":null,"_tldtransfer":null,"_tldwhoisprivacy":null,"_tldregistrarchange":null,"_tldregistrantchange":null,"_tldwhoisupdate":null,"_tldnameserverupdate":null,"_tlddeletesofort":null,"_tlddeleteexpire":null,"_tldumlaute":null,"_tldrestore":null,"_tldbildname":null,"_tldbildurl":null,"_tld_bedeutung":null,"_tldbesonderheiten":null,"_oembed_ad96e4112edb9f8ffa35731d4098bc6b":null,"_oembed_8357e2b8a2575c74ed5978f262a10126":null,"_oembed_3d5fea5103dd0d22ec5d6a33eff7f863":null,"_eael_widget_elements":null,"_oembed_0d8a206f09633e3d62b95a15a4dd0487":null,"_oembed_time_0d8a206f09633e3d62b95a15a4dd0487":null,"_aioseo_description":null,"_eb_attr":null,"_eb_data_table":null,"_oembed_819a879e7da16dd629cfd15a97334c8a":null,"_oembed_time_819a879e7da16dd629cfd15a97334c8a":null,"_acf_changed":null,"_wpcode_auto_insert":null,"_edit_last":null,"_edit_lock":null,"_oembed_e7b913c6c84084ed9702cb4feb012ddd":null,"_oembed_bfde9e10f59a17b85fc8917fa7edf782":null,"_oembed_time_bfde9e10f59a17b85fc8917fa7edf782":null,"_oembed_03514b67990db061d7c4672de26dc514":null,"_oembed_time_03514b67990db061d7c4672de26dc514":null,"rank_math_news_sitemap_robots":null,"rank_math_robots":null,"_eael_post_view_count":"126","_trp_automatically_translated_slug_ru_ru":null,"_trp_automatically_translated_slug_et":null,"_trp_automatically_translated_slug_lv":null,"_trp_automatically_translated_slug_fr_fr":null,"_trp_automatically_translated_slug_en_us":null,"_wp_old_slug":null,"_trp_automatically_translated_slug_da_dk":null,"_trp_automatically_translated_slug_pl_pl":null,"_trp_automatically_translated_slug_es_es":null,"_trp_automatically_translated_slug_hu_hu":null,"_trp_automatically_translated_slug_fi":null,"_trp_automatically_translated_slug_ja":null,"_trp_automatically_translated_slug_lt_lt":null,"_elementor_edit_mode":null,"_elementor_template_type":null,"_elementor_version":null,"_elementor_pro_version":null,"_wp_page_template":null,"_elementor_page_settings":null,"_elementor_data":null,"_elementor_css":null,"_elementor_conditions":null,"_happyaddons_elements_cache":null,"_oembed_75446120c39305f0da0ccd147f6de9cb":null,"_oembed_time_75446120c39305f0da0ccd147f6de9cb":null,"_oembed_3efb2c3e76a18143e7207993a2a6939a":null,"_oembed_time_3efb2c3e76a18143e7207993a2a6939a":null,"_oembed_59808117857ddf57e478a31d79f76e4d":null,"_oembed_time_59808117857ddf57e478a31d79f76e4d":null,"_oembed_965c5b49aa8d22ce37dfb3bde0268600":null,"_oembed_time_965c5b49aa8d22ce37dfb3bde0268600":null,"_oembed_81002f7ee3604f645db4ebcfd1912acf":null,"_oembed_time_81002f7ee3604f645db4ebcfd1912acf":null,"_elementor_screenshot":null,"_oembed_7ea3429961cf98fa85da9747683af827":null,"_oembed_time_7ea3429961cf98fa85da9747683af827":null,"_elementor_controls_usage":null,"_elementor_page_assets":[],"_elementor_screenshot_failed":null,"theplus_transient_widgets":null,"_eael_custom_js":null,"_wp_old_date":null,"_trp_automatically_translated_slug_it_it":null,"_trp_automatically_translated_slug_pt_pt":null,"_trp_automatically_translated_slug_zh_cn":null,"_trp_automatically_translated_slug_nl_nl":null,"_trp_automatically_translated_slug_pt_br":null,"_trp_automatically_translated_slug_sv_se":null,"rank_math_analytic_object_id":null,"rank_math_internal_links_processed":"1","_trp_automatically_translated_slug_ro_ro":null,"_trp_automatically_translated_slug_sk_sk":null,"_trp_automatically_translated_slug_bg_bg":null,"_trp_automatically_translated_slug_sl_si":null,"litespeed_vpi_list":null,"litespeed_vpi_list_mobile":null,"rank_math_seo_score":null,"rank_math_contentai_score":null,"ilj_limitincominglinks":null,"ilj_maxincominglinks":null,"ilj_limitoutgoinglinks":null,"ilj_maxoutgoinglinks":null,"ilj_limitlinksperparagraph":null,"ilj_linksperparagraph":null,"ilj_blacklistdefinition":null,"ilj_linkdefinition":null,"_eb_reusable_block_ids":null,"rank_math_focus_keyword":"HTTP Caching","rank_math_og_content_image":null,"_yoast_wpseo_metadesc":null,"_yoast_wpseo_content_score":null,"_yoast_wpseo_focuskeywords":null,"_yoast_wpseo_keywordsynonyms":null,"_yoast_wpseo_estimated-reading-time-minutes":null,"rank_math_description":null,"surfer_last_post_update":null,"surfer_last_post_update_direction":null,"surfer_keywords":null,"surfer_location":null,"surfer_draft_id":null,"surfer_permalink_hash":null,"surfer_scrape_ready":null,"_thumbnail_id":"20014","footnotes":null,"_links":{"self":[{"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/posts\/20021","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/comments?post=20021"}],"version-history":[{"count":0,"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/posts\/20021\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/media\/20014"}],"wp:attachment":[{"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/media?parent=20021"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/categories?post=20021"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/tags?post=20021"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}