{"id":15344,"date":"2025-09-01T19:51:26","date_gmt":"2025-09-01T17:51:26","guid":{"rendered":"https:\/\/dhosting.pl\/pomoc\/?post_type=manual_kb&#038;p=15344"},"modified":"2025-09-01T19:51:26","modified_gmt":"2025-09-01T17:51:26","slug":"cdn-a-dynamiczne-tresci-esi-byo-keys-personalizacja","status":"publish","type":"manual_kb","link":"https:\/\/dhosting.pl\/pomoc\/baza-wiedzy\/cdn-a-dynamiczne-tresci-esi-byo-keys-personalizacja\/","title":{"rendered":"CDN a dynamiczne tre\u015bci &#8211; ESI, BYO keys, personalizacja"},"content":{"rendered":"<p><!-- Meta description: Jak \u0142\u0105czy\u0107 CDN z dynamicznym HTML: ESI, w\u0142asne klucze cache i strategie personalizacji bez fragmentacji - wzorce, pu\u0142apki i gotowe regu\u0142y. --><\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 ez-toc-wrap-left counter-flat ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Spis tre\u015bci<\/p>\n<span class=\"ez-toc-title-toggle\"><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/dhosting.pl\/pomoc\/baza-wiedzy\/cdn-a-dynamiczne-tresci-esi-byo-keys-personalizacja\/#Dlaczego_CDN_i_dynamiczny_HTML_sie_nie_wykluczaja\" >Dlaczego CDN i dynamiczny HTML si\u0119 nie wykluczaj\u0105<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/dhosting.pl\/pomoc\/baza-wiedzy\/cdn-a-dynamiczne-tresci-esi-byo-keys-personalizacja\/#Wzorce_architektoniczne_fragmenty_i_ESI\" >Wzorce architektoniczne: fragmenty i ESI<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/dhosting.pl\/pomoc\/baza-wiedzy\/cdn-a-dynamiczne-tresci-esi-byo-keys-personalizacja\/#BYO_cache_keys_jak_budowac_klucze_by_nie_pofragmentowac_cache\" >BYO cache keys: jak budowa\u0107 klucze, by nie pofragmentowa\u0107 cache<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/dhosting.pl\/pomoc\/baza-wiedzy\/cdn-a-dynamiczne-tresci-esi-byo-keys-personalizacja\/#Strategie_personalizacji_bez_niszczenia_cache\" >Strategie personalizacji bez niszczenia cache<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/dhosting.pl\/pomoc\/baza-wiedzy\/cdn-a-dynamiczne-tresci-esi-byo-keys-personalizacja\/#Inwalidacja_spojnosc_i_bezpieczenstwo\" >Inwalidacja, sp\u00f3jno\u015b\u0107 i bezpiecze\u0144stwo<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/dhosting.pl\/pomoc\/baza-wiedzy\/cdn-a-dynamiczne-tresci-esi-byo-keys-personalizacja\/#Pomiar_efektow_i_kontrola_jakosci\" >Pomiar efekt\u00f3w i kontrola jako\u015bci<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/dhosting.pl\/pomoc\/baza-wiedzy\/cdn-a-dynamiczne-tresci-esi-byo-keys-personalizacja\/#Dobre_praktyki_dla_e-commerce_i_tresci\" >Dobre praktyki dla e-commerce i tre\u015bci<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/dhosting.pl\/pomoc\/baza-wiedzy\/cdn-a-dynamiczne-tresci-esi-byo-keys-personalizacja\/#Podsumowujac\" >Podsumowuj\u0105c<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"Dlaczego_CDN_i_dynamiczny_HTML_sie_nie_wykluczaja\"><\/span>Dlaczego CDN i dynamiczny HTML si\u0119 nie wykluczaj\u0105<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>CDN nie musi oznacza\u0107 wy\u0142\u0105cznie statycznych plik\u00f3w. Dzi\u0119ki fragmentacji widoku i inteligentnym kluczom cache mo\u017cna buforowa\u0107 wi\u0119kszo\u015b\u0107 HTML, a cz\u0119\u015b\u0107 wra\u017cliw\u0105 serwowa\u0107 dynamicznie. Efekt to ni\u017cszy TTFB dla go\u015bci i szybszy LCP przy zachowaniu poprawno\u015bci sesji.<\/p>\n<p>Klucz polega na rozdzieleniu tego, co wsp\u00f3lne dla wszystkich, od tego, co per u\u017cytkownik. Je\u015bli szablon strony i tre\u015b\u0107 g\u0142\u00f3wna s\u0105 wsp\u00f3lne, a r\u00f3\u017cni si\u0119 jedynie pasek \u201eWitaj, Jan\u201d, koszyk czy banner A\/B, to wystarczy \u201edziurawi\u0107\u201d dokument na te fragmenty zamiast wy\u0142\u0105cza\u0107 cache dla ca\u0142o\u015bci.<\/p>\n<div id=\"dhost-3138515283\" class=\"dhost-inpost dhost-entity-placement\"><a href=\"https:\/\/dhosting.pl\/opieka-stron.html?utm_source=pomoc&utm_medium=artykul&utm_campaign=pomoc\" target=\"_blank\">\r\n\t<img decoding=\"async\" src=\"https:\/\/dhosting.pl\/pomoc\/wp-content\/uploads\/2025\/01\/baner-opieka.png\" alt=\"opieka stron www\">\r\n<\/a>\r\n<br \/>\r\n<br \/><\/div><h2><span class=\"ez-toc-section\" id=\"Wzorce_architektoniczne_fragmenty_i_ESI\"><\/span>Wzorce architektoniczne: fragmenty i ESI<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Edge Side Includes (ESI) pozwala dzieli\u0107 dokument na fragmenty renderowane i cache\u2019owane niezale\u017cnie. G\u0142\u00f3wny HTML mo\u017ce mie\u0107 d\u0142ugi TTL, a ma\u0142e inkludy dla koszyka czy personalizacji pobierane s\u0105 z originu lub z kr\u00f3tkiego mikrocache. To minimalizuje fragmentacj\u0119 wsp\u00f3lnego cache i ogranicza obci\u0105\u017cenie serwera.<\/p>\n<p>Alternatyw\u0105 dla ESI jest sk\u0142adanie na kraw\u0119dzi: funkcje edge lub workers wstrzykuj\u0105 fragmenty do buforowanego szablonu. Ten wzorzec sprawdza si\u0119, gdy nie masz wsparcia ESI, ale dysponujesz logik\u0105 na edge. Fragmenty, kt\u00f3re nie mog\u0105 by\u0107 wsp\u00f3\u0142dzielone (np. saldo konta), oznacz jako no-store i pobieraj wy\u0142\u0105cznie po HTTPS z autoryzacj\u0105, bez zapisywania we wsp\u00f3lnym cache.<\/p>\n<p>Dla element\u00f3w p\u00f3\u0142dynamicznych zastosuj mikrocache 10\u201360 s. Przyk\u0142ad to licznik stan\u00f3w magazynowych, kursy walut, listy bestseller\u00f3w. Taki bufor wyg\u0142adza skoki ruchu i pozwala unikn\u0105\u0107 \u201ethundering herd\u201d, a u\u017cytkownik nie odczuwa op\u00f3\u017anie\u0144.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"BYO_cache_keys_jak_budowac_klucze_by_nie_pofragmentowac_cache\"><\/span>BYO cache keys: jak budowa\u0107 klucze, by nie pofragmentowa\u0107 cache<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>BYO cache keys oznacza, \u017ce sam definiujesz, co wchodzi do klucza cache. Wsp\u00f3lny b\u0142\u0105d to dok\u0142adanie do klucza wszystkiego, co wida\u0107 w \u017c\u0105daniu. Zamiast tego w\u0142\u0105cz tylko te wymiary, kt\u00f3re realnie zmieniaj\u0105 HTML.<\/p>\n<p><strong>Praktyczny szablon klucza:<\/strong><\/p>\n<ul>\n<li>\u015acie\u017cka i wybrane parametry wp\u0142ywaj\u0105ce na widok &#8211; np. <code class=\"\" data-line=\"\">?page=<\/code>, <code class=\"\" data-line=\"\">?sort=<\/code>, <code class=\"\" data-line=\"\">?color=<\/code>.<\/li>\n<li>Bucket urz\u0105dzenia &#8211; desktop vs mobile, je\u015bli layout si\u0119 r\u00f3\u017cni.<\/li>\n<li>Region lub strefa cenowa &#8211; kraj, waluta, strefa podatkowa w postaci znormalizowanego koszyka, np. <code class=\"\" data-line=\"\">eu|usd|vat20<\/code>.<\/li>\n<li>Wersja szablonu &#8211; numer builda, aby po deployu naturalnie przewietrzy\u0107 cache.<\/li>\n<\/ul>\n<p><strong>Czego nie dodawa\u0107 do klucza:<\/strong> parametry \u015bledz\u0105ce (<code class=\"\" data-line=\"\">utm_*<\/code>, <code class=\"\" data-line=\"\">gclid<\/code>, <code class=\"\" data-line=\"\">fbclid<\/code>), ca\u0142e nag\u0142\u00f3wki <code class=\"\" data-line=\"\">Cookie<\/code> oraz nietrwa\u0142e identyfikatory sesji i tokeny CSRF.<\/p>\n<p>Je\u015bli platforma wspiera tagowanie obiekt\u00f3w, dodaj nag\u0142\u00f3wek lub metadane typu \u201eSurrogate-Key: post:123, cat:shoes\u201d. Dzi\u0119ki temu uniewa\u017cnisz w\u0142a\u015bciwe fragmenty po publikacji lub zmianie cen, bez czyszczenia ca\u0142ego cache.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Strategie_personalizacji_bez_niszczenia_cache\"><\/span>Strategie personalizacji bez niszczenia cache<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><strong>1) \u201eHole punching\u201d dla element\u00f3w per u\u017cytkownik<\/strong><br \/>\nBuforuj dokument bez stanu u\u017cytkownika, a personalizacj\u0119 wstrzykuj jako ESI lub dynamiczny fetch na edge. Dla koszyka, licznika \u201erecently viewed\u201d czy banera konta ustaw <code class=\"\" data-line=\"\">no-store<\/code> i kr\u00f3tki timeout.<\/p>\n<p><strong>2) Personalizacja po stronie klienta<\/strong><br \/>\nG\u0142\u00f3wny HTML i dane publiczne id\u0105 z cache, a per-user detale doci\u0105gane s\u0105 AJAX-em z endpointu chronionego tokenem. Ten endpoint nie trafia do wsp\u00f3\u0142dzielonego cache, za to dokument HTML zachowuje wysoki hit ratio.<\/p>\n<p><strong>3) Warianty oparte na bucketach<\/strong><br \/>\nZamiast tworzy\u0107 setki wariant\u00f3w, u\u017cyj kilku kube\u0142k\u00f3w: 2\u20134 segmenty geograficzne, 2 layouty RWD, 2\u20133 koszyki cenowe. Klucz cache zawiera tylko kube\u0142ek, a nie pe\u0142ny wektor cech u\u017cytkownika.<\/p>\n<p><strong>4) Serwowanie warunkowe, ale kontrolowane<\/strong><br \/>\nJe\u017celi musisz zmieni\u0107 ca\u0142e drzewo DOM (np. inny hero dla kampanii), dodaj do klucza jedn\u0105 kontrolowan\u0105 zmienn\u0105, np. <code class=\"\" data-line=\"\">campaign=A<\/code> lub <code class=\"\" data-line=\"\">campaign=B<\/code>. Unikaj \u0142\u0105czenia jej z parametrami \u015bledz\u0105cymi.<\/p>\n<p>Uzupe\u0142nienia: stosuj <code class=\"\" data-line=\"\">stale-while-revalidate<\/code>, rozwa\u017c <em>Early Hints 103<\/em> i pami\u0119taj o <code class=\"\" data-line=\"\">crossorigin<\/code> dla font\u00f3w.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Inwalidacja_spojnosc_i_bezpieczenstwo\"><\/span>Inwalidacja, sp\u00f3jno\u015b\u0107 i bezpiecze\u0144stwo<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Bezpieczny cache zaczyna si\u0119 od regu\u0142y: odpowiedzi z <code class=\"\" data-line=\"\">Set-Cookie<\/code> i prywatnymi danymi nie mog\u0105 trafia\u0107 do wsp\u00f3\u0142dzielonego cache. Ustaw <code class=\"\" data-line=\"\">Cache-Control: no-store<\/code> dla stron konta, checkoutu, paneli i API z danymi wra\u017cliwymi. Z kolei tre\u015bci publiczne oznacz <code class=\"\" data-line=\"\">public, max-age=..., stale-while-revalidate=...<\/code>.<\/p>\n<p>Inwalidacj\u0119 opieraj na tagach lub \u015bcie\u017ckach. Po publikacji artyku\u0142u uniewa\u017cnij jego URL oraz listy, kt\u00f3re go zawieraj\u0105. Po zmianie ceny produktu uniewa\u017cnij karty produktu, listy kategorii i bloki rekomendacji. Unikaj \u201epurge all\u201d.<\/p>\n<p>Dbaj o idempotencj\u0119 i metody HTTP. GET mo\u017ce by\u0107 buforowany, POST nie. Endpointy AJAX tylko do odczytu serwuj jako GET z odpowiednimi nag\u0142\u00f3wkami. Je\u017celi musisz u\u017cy\u0107 POST, wy\u0142\u0105cz cache i w\u0142\u0105cz zabezpieczenia.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Pomiar_efektow_i_kontrola_jakosci\"><\/span>Pomiar efekt\u00f3w i kontrola jako\u015bci<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Mierz w terenie p75 LCP, TTFB dokumentu, hit ratio per \u015bcie\u017cka. Osobno oceniaj \u201eguest\u201d vs \u201elogged-in\u201d.<\/p>\n<p>Sprawdzaj, czy prywatne dane nie trafiaj\u0105 do cache. W pr\u00f3bkach HTML szukaj token\u00f3w i identyfikator\u00f3w. W DevTools weryfikuj, \u017ce elementy per u\u017cytkownik \u0142aduj\u0105 si\u0119 osobno i maj\u0105 <code class=\"\" data-line=\"\">Cache-Control: no-store<\/code>.<\/p>\n<p>Diagnozuj fragmentacj\u0119 &#8211; je\u015bli hit ratio spada, zwykle winne s\u0105 parametry UTM albo zbyt wiele wymiar\u00f3w w kluczu. Znormalizuj parametry, ogranicz liczb\u0119 bucket\u00f3w i trzymaj stabilny build id w kluczu.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Dobre_praktyki_dla_e-commerce_i_tresci\"><\/span>Dobre praktyki dla e-commerce i tre\u015bci<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><strong>E-commerce:<\/strong> cache kategorii i kart produktu dla go\u015bci, bypass koszyka i checkoutu. Liczniki stan\u00f3w i ceny w mikrocache. Rekomendacje z kr\u00f3tkim TTL lub no-store.<\/p>\n<p><strong>Portale i blogi:<\/strong> d\u0142ugi TTL dla artyku\u0142\u00f3w, listy z <code class=\"\" data-line=\"\">stale-while-revalidate<\/code>, widgety \u201enajcz\u0119\u015bciej czytane\u201d w mikrocache. Kategorie korzystaj\u0105 z BYO keys dla sortowania i filtr\u00f3w.<\/p>\n<p><strong>SaaS i panele:<\/strong> marketing publiczny cache\u2019uj agresywnie, aplikacj\u0119 w\u0142a\u015bciw\u0105 traktuj jak prywatn\u0105 &#8211; HTML no-store, API zabezpieczone, ewentualny cache po stronie klienta.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Podsumowujac\"><\/span>Podsumowuj\u0105c<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>CDN i dynamiczne tre\u015bci wsp\u00f3\u0142graj\u0105, je\u015bli rozdzielisz wsp\u00f3lny szablon od danych per u\u017cytkownik. Zastosuj ESI lub sk\u0142adanie na kraw\u0119dzi do \u201edziurawienia\u201d dokumentu, a BYO cache keys zredukuje fragmentacj\u0119 i podniesie hit ratio. Personalizacj\u0119 realizuj przez fragmenty, buckety i \u017c\u0105dania klienta, a prywatne dane trzymaj poza wsp\u00f3\u0142dzielonym cache. Dodaj <code class=\"\" data-line=\"\">stale-while-revalidate<\/code>, m\u0105dre inwalidacje i monitoring p75 LCP oraz TTFB &#8211; to da szybki serwis bez kompromis\u00f3w na bezpiecze\u0144stwie i poprawno\u015bci sesji.<\/p>\n","protected":false},"author":6,"featured_media":10957,"parent":0,"menu_order":0,"template":"","format":"standard","manualknowledgebasecat":[121,118],"manual_kb_tag":[5925,5916,5918,5914,5922,5884,5923,5915,5921,5920,5919,5917,5908,76,5924],"class_list":["post-15344","manual_kb","type-manual_kb","status-publish","format-standard","has-post-thumbnail","hentry","manualknowledgebasecat-inne","manualknowledgebasecat-pozostale","manual_kb_tag-bezpieczenstwo-cache","manual_kb_tag-byo-cache-keys","manual_kb_tag-cache-html","manual_kb_tag-cdn-dynamiczne-tresci","manual_kb_tag-e-commerce-cache","manual_kb_tag-early-hints-103","manual_kb_tag-edge-compute","manual_kb_tag-esi","manual_kb_tag-hit-ratio","manual_kb_tag-inwalidacja-cache","manual_kb_tag-mikrocache","manual_kb_tag-personalizacja","manual_kb_tag-stale-while-revalidate","manual_kb_tag-wordpress","manual_kb_tag-workers"],"_links":{"self":[{"href":"https:\/\/dhosting.pl\/pomoc\/wp-json\/wp\/v2\/manual_kb\/15344","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dhosting.pl\/pomoc\/wp-json\/wp\/v2\/manual_kb"}],"about":[{"href":"https:\/\/dhosting.pl\/pomoc\/wp-json\/wp\/v2\/types\/manual_kb"}],"author":[{"embeddable":true,"href":"https:\/\/dhosting.pl\/pomoc\/wp-json\/wp\/v2\/users\/6"}],"version-history":[{"count":1,"href":"https:\/\/dhosting.pl\/pomoc\/wp-json\/wp\/v2\/manual_kb\/15344\/revisions"}],"predecessor-version":[{"id":15345,"href":"https:\/\/dhosting.pl\/pomoc\/wp-json\/wp\/v2\/manual_kb\/15344\/revisions\/15345"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dhosting.pl\/pomoc\/wp-json\/wp\/v2\/media\/10957"}],"wp:attachment":[{"href":"https:\/\/dhosting.pl\/pomoc\/wp-json\/wp\/v2\/media?parent=15344"}],"wp:term":[{"taxonomy":"manualknowledgebasecat","embeddable":true,"href":"https:\/\/dhosting.pl\/pomoc\/wp-json\/wp\/v2\/manualknowledgebasecat?post=15344"},{"taxonomy":"manual_kb_tag","embeddable":true,"href":"https:\/\/dhosting.pl\/pomoc\/wp-json\/wp\/v2\/manual_kb_tag?post=15344"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}