{"id":15551,"date":"2026-09-05T13:31:01","date_gmt":"2026-09-05T11:31:01","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/narzedzia\/compression-negotiation-checker-gzip-brotli-zstd\/"},"modified":"2026-09-05T13:31:01","modified_gmt":"2026-09-05T11:31:01","slug":"compression-negotiation-checker-gzip-brotli-zstd","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/compression-negotiation-checker-gzip-brotli-zstd\/","title":{"rendered":"Sprawdzanie negocjacji kompresji: gzip, Brotli, zstd"},"content":{"rendered":"<div class=\"gtm-analyser-container\" style=\"background: var(--bg-panel, #1e1e24); padding: 25px; border-radius: 8px; border: 1px solid var(--border, #2a2a35);\">\n<p style=\"color: var(--text-secondary, #a0a0b0); margin-bottom: 20px;\">Przegl\u0105darka podaje w Accept-Encoding, co potrafi rozpakowa\u0107, a serwer wybiera jedno kodowanie. Kt\u00f3re i ile ono oszcz\u0119dza, nie wida\u0107 na samej stronie. To sprawdzenie pobiera ten sam adres pi\u0119\u0107 razy z tego serwera: raz bez kompresji jako odniesienie, po jednym razie tylko z gzip, Brotli i zstd oraz raz z \u0142\u0105czonym nag\u0142\u00f3wkiem, jaki wysy\u0142aj\u0105 aktualne przegl\u0105darki. Dla ka\u017cdej odpowiedzi liczy bajty na \u0142\u0105czu wobec rozmiaru po rozpakowaniu i odczytuje Content-Encoding, Vary i ETag.<\/p>\n<div style=\"margin-bottom: 14px;\">\n        <label for=\"cp-url\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Adres (strona, skrypt, arkusz styl\u00f3w lub obraz)<\/label><br \/>\n        <input id=\"cp-url\" type=\"text\" value=\"https:\/\/www.wikipedia.org\/\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; box-sizing: border-box; font-family: monospace;\">\n    <\/div>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.82rem; margin-bottom: 16px;\">Z tego serwera pod podany adres trafiaj\u0105 przekierowania i pi\u0119\u0107 pe\u0142nych pobra\u0144 po maksymalnie 3 MB. Hosty w sieciach prywatnych, loopback i link-local s\u0105 odrzucane. Zapytanie chroni reCAPTCHA v3; adres IP wywo\u0142uj\u0105cego i cel s\u0105 przechowywane przez godzin\u0119 w celu ograniczenia cz\u0119stotliwo\u015bci.<\/p>\n<p>    <button id=\"cp-btn\" class=\"button\" style=\"background: var(--accent, #7ee787); color: var(--on-accent, #0b1114); border: none; padding: 12px 24px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Sprawdzenie kompresji<\/button><\/p>\n<div id=\"cp-ausgabe\" style=\"margin-top: 22px;\"><\/div>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.8rem; margin: 24px 0 0;\">Granice, o kt\u00f3rych warto wiedzie\u0107: sprawdzany jest tylko jeden z rozwi\u0105zanych adres\u00f3w; CDN mo\u017ce kompresowa\u0107 inaczej w zale\u017cno\u015bci od w\u0119z\u0142a albo dopiero po pierwszym chybieniu w pami\u0119ci podr\u0119cznej; czasy to pojedyncze pomiary i odzwierciedlaj\u0105 g\u0142\u00f3wnie rozmiar przesy\u0142u i odleg\u0142o\u015b\u0107; tre\u015bci powy\u017cej 3 MB s\u0105 obcinane, wi\u0119c ich proporcje s\u0105 tylko przybli\u017cone; a serwer kompresuj\u0105cy w locie mo\u017ce przy ka\u017cdym uruchomieniu pokaza\u0107 nieco inne liczby bajt\u00f3w.<\/p>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"einleitung\":\"Przegl\u0105darka podaje w Accept-Encoding, co potrafi rozpakowa\u0107, a serwer wybiera jedno kodowanie. Kt\u00f3re i ile ono oszcz\u0119dza, nie wida\u0107 na samej stronie. To sprawdzenie pobiera ten sam adres pi\u0119\u0107 razy z tego serwera: raz bez kompresji jako odniesienie, po jednym razie tylko z gzip, Brotli i zstd oraz raz z \u0142\u0105czonym nag\u0142\u00f3wkiem, jaki wysy\u0142aj\u0105 aktualne przegl\u0105darki. Dla ka\u017cdej odpowiedzi liczy bajty na \u0142\u0105czu wobec rozmiaru po rozpakowaniu i odczytuje Content-Encoding, Vary i ETag.\",\"label_url\":\"Adres (strona, skrypt, arkusz styl\u00f3w lub obraz)\",\"datenschutz\":\"Z tego serwera pod podany adres trafiaj\u0105 przekierowania i pi\u0119\u0107 pe\u0142nych pobra\u0144 po maksymalnie 3 MB. Hosty w sieciach prywatnych, loopback i link-local s\u0105 odrzucane. Zapytanie chroni reCAPTCHA v3; adres IP wywo\u0142uj\u0105cego i cel s\u0105 przechowywane przez godzin\u0119 w celu ograniczenia cz\u0119stotliwo\u015bci.\",\"knopf\":\"Sprawdzenie kompresji\",\"laeuft\":\"Trwa pi\u0119\u0107 pobra\u0144...\",\"grenze\":\"Granice, o kt\u00f3rych warto wiedzie\u0107: sprawdzany jest tylko jeden z rozwi\u0105zanych adres\u00f3w; CDN mo\u017ce kompresowa\u0107 inaczej w zale\u017cno\u015bci od w\u0119z\u0142a albo dopiero po pierwszym chybieniu w pami\u0119ci podr\u0119cznej; czasy to pojedyncze pomiary i odzwierciedlaj\u0105 g\u0142\u00f3wnie rozmiar przesy\u0142u i odleg\u0142o\u015b\u0107; tre\u015bci powy\u017cej 3 MB s\u0105 obcinane, wi\u0119c ich proporcje s\u0105 tylko przybli\u017cone; a serwer kompresuj\u0105cy w locie mo\u017ce przy ka\u017cdym uruchomieniu pokaza\u0107 nieco inne liczby bajt\u00f3w.\",\"h_antwort\":\"Odpowied\u017a\",\"zeile_url\":\"Zmierzony adres\",\"zeile_ip\":\"Rozwi\u0105zane adresy\",\"zeile_server\":\"Nag\u0142\u00f3wek Server\",\"zeile_typ\":\"Typ tre\u015bci\",\"zeile_basis\":\"Rozmiar po rozpakowaniu\",\"zeile_dauer\":\"Czas\",\"zeile_limit\":\"Pozosta\u0142e sprawdzenia w tej godzinie\",\"klasse_text\":\"kompresowalny\",\"klasse_schon_komprimiert\":\"ju\u017c skompresowany przez format\",\"klasse_unbekannt\":\"nieznany\",\"h_varianten\":\"Pi\u0119\u0107 \u017c\u0105da\u0144, jeden adres\",\"spalte_accept\":\"Wys\u0142ane Accept-Encoding\",\"spalte_kodierung\":\"Content-Encoding\",\"spalte_leitung\":\"Na \u0142\u0105czu\",\"spalte_anteil\":\"Rozpakowanego\",\"spalte_status\":\"Status\",\"spalte_ttfb\":\"Pierwszy bajt\",\"spalte_gesamt\":\"\u0141\u0105cznie\",\"variante_identity\":\"identity\",\"variante_gzip\":\"gzip\",\"variante_br\":\"br\",\"variante_zstd\":\"zstd\",\"variante_browser\":\"gzip, deflate, br, zstd\",\"gekappt_kurz\":\"(obci\u0119te przy 3 MB)\",\"fehlgeschlagen\":\"niepowodzenie\",\"h_befunde\":\"Ustalenia\",\"stufe_hoch\":\"Wysoka\",\"stufe_mittel\":\"\u015arednia\",\"stufe_niedrig\":\"Niska\",\"stufe_info\":\"Informacja\",\"stufe_gut\":\"W porz\u0105dku\",\"keine_befunde\":\"Brak uwag.\",\"urteil_gut\":\"Kompresja jest negocjowana tak, jak oczekuj\u0105 przegl\u0105darki.\",\"urteil_warnung\":\"Kompresja dzia\u0142a, ale co\u015b kosztuje bajty albo myli pami\u0119ci podr\u0119czne.\",\"urteil_kritisch\":\"Brak jakiejkolwiek kompresji albo adresu nie da\u0142o si\u0119 pobra\u0107.\",\"fehler_kein_token\":\"Sprawdzenie nie mog\u0142o si\u0119 rozpocz\u0105\u0107, poniewa\u017c reCAPTCHA si\u0119 nie za\u0142adowa\u0142a.\",\"fehler_captcha\":\"reCAPTCHA uzna\u0142a \u017c\u0105danie za zautomatyzowane. Zwykle pomaga ponowne za\u0142adowanie strony.\",\"fehler_zu_viele\":\"Osi\u0105gni\u0119to limit {limit} sprawdze\u0144 na godzin\u0119 dla tego adresu.\",\"fehler_adresse\":\"Tego adresu nie da si\u0119 u\u017cy\u0107.\",\"fehler_zu_viele_spruenge\":\"Adres przekierowuje wi\u0119cej ni\u017c pi\u0119\u0107 razy; \u0142a\u0144cuch nie by\u0142 dalej \u015bledzony.\",\"fehler_zaehler\":\"Licznik jest niedost\u0119pny, dlatego nic nie zosta\u0142o sprawdzone.\",\"fehler_pruefdienst\":\"Us\u0142uga reCAPTCHA by\u0142a nieosi\u0105galna.\",\"fehler_aufbau\":\"Us\u0142uga nie jest poprawnie skonfigurowana. B\u0142\u0105d le\u017cy po tej stronie.\",\"fehler_eingabe\":\"\u017b\u0105danie by\u0142o nieczytelne.\",\"fehler_methode\":\"Niew\u0142a\u015bciwa metoda \u017c\u0105dania.\",\"fehler_netz\":\"Us\u0142uga by\u0142a nieosi\u0105galna.\",\"fehler_antwort\":\"Odpowied\u017a by\u0142a nieczytelna.\",\"fehler_unbekannt\":\"Co\u015b posz\u0142o nie tak, a nie ma na to osobnego komunikatu.\",\"grund_leer\":\"Nic nie zosta\u0142o wpisane.\",\"grund_zu_lang\":\"Wpis jest za d\u0142ugi.\",\"grund_unlesbar\":\"To nie jest czytelny adres.\",\"grund_schema\":\"Sprawdzane s\u0105 tylko adresy http i https.\",\"grund_benutzerinfo\":\"Wpisy z danymi logowania s\u0105 odrzucane.\",\"grund_kein_punkt\":\"Nazwa hosta potrzebuje co najmniej jednej kropki.\",\"grund_hostform\":\"Wymagana jest nazwa hosta, nie adres IP.\",\"grund_port\":\"Sprawdzane s\u0105 tylko porty 80, 443, 8080 i 8443.\",\"grund_gesperrter_bereich\":\"Ten host rozwi\u0105zuje si\u0119 do sieci prywatnej lub zarezerwowanej. Takie nigdy nie s\u0105 kontaktowane.\",\"grund_kein_dns\":\"Nazwy hosta nie da si\u0119 rozwi\u0105za\u0107.\",\"grund_abruf\":\"Adres nie odpowiedzia\u0142.\",\"befund_weiterleitung\":\"Przekierowano {n} raz(y) na {ziel} || Pomiary dotycz\u0105 ko\u0144cowego adresu \u0142a\u0144cucha.\",\"befund_abruf_fehlgeschlagen\":\"Adres nie odpowiada || \u017badne z pi\u0119ciu \u017c\u0105da\u0144 nie da\u0142o odpowiedzi: {fehler}.\",\"befund_status_fehler\":\"Serwer odpowiedzia\u0142 statusem {status} || Mierzona jest kompresja strony b\u0142\u0119du, a nie zamierzonego zasobu.\",\"befund_gekappt\":\"Tre\u015b\u0107 obci\u0119ta przy {mb} MB || Nieskompresowane odniesienie jest wi\u0119ksze ni\u017c limit; proporcje dotycz\u0105 pierwszych {mb} MB i s\u0105 tylko przybli\u017cone.\",\"befund_kompression_erzwungen\":\"Skompresowane mimo \u017c\u0105dania identity ({kodierung}) || Serwer ignoruje Accept-Encoding i zawsze wysy\u0142a {kodierung}. Klienci, kt\u00f3rzy nie potrafi\u0105 tego rozpakowa\u0107, w tym niekt\u00f3re narz\u0119dzia monitoruj\u0105ce i stare biblioteki, dostaj\u0105 nieczytelne bajty.\",\"befund_inhalt_verschieden\":\"Pi\u0119\u0107 odpowiedzi r\u00f3\u017cni si\u0119 tre\u015bci\u0105 ({n} wersji) || Po rozpakowaniu tre\u015bci nie s\u0105 identyczne. Dynamiczna zawarto\u015b\u0107, tokeny na \u017c\u0105danie albo warianty A\\\/B zmieniaj\u0105 si\u0119 mi\u0119dzy \u017c\u0105daniami, wi\u0119c liczby bajt\u00f3w por\u00f3wnuj\u0105 nieco inne strony.\",\"befund_typ_schon_komprimiert\":\"Typ tre\u015bci {typ} jest skompresowany przez sw\u00f3j format || Obrazy, wideo, fonty WOFF2 i archiwa s\u0105 ju\u017c skompresowane; gzip lub Brotli na wierzchu nic nie oszcz\u0119dza, a kosztuje CPU. Brak Content-Encoding jest tu prawid\u0142owy.\",\"befund_unnoetig_komprimiert\":\"{kodierung} zastosowane do ju\u017c skompresowanego formatu ({prozent} % orygina\u0142u) || Serwer kompresuje zas\u00f3b, kt\u00f3rego format jest ju\u017c skompresowany. Oszcz\u0119dno\u015b\u0107 jest zerowa, a ka\u017cda odpowied\u017a kosztuje czas procesora na serwerze i w przegl\u0105darce. Zwyk\u0142e rozwi\u0105zanie to wy\u0142\u0105czenie tych typ\u00f3w tre\u015bci z regu\u0142y kompresji.\",\"befund_typ_unbekannt\":\"Typ tre\u015bci {typ} niesklasyfikowany || To sprawdzenie nie wie, czy kompresja ma sens dla tego typu; liczby bajt\u00f3w pozostaj\u0105 wa\u017cne.\",\"befund_kleine_antwort\":\"Ma\u0142a odpowied\u017a: {bytes} bajt\u00f3w || Poni\u017cej oko\u0142o 1 KB kompresja ledwo si\u0119 op\u0142aca; nag\u0142\u00f3wki wa\u017c\u0105 wi\u0119cej ni\u017c oszcz\u0119dno\u015b\u0107. Wiele serwer\u00f3w celowo j\u0105 pomija przy ma\u0142ych tre\u015bciach.\",\"befund_groesse\":\"Rozmiar po rozpakowaniu {kb} KB ({bytes} bajt\u00f3w) || Odniesienie, do kt\u00f3rego odnosi si\u0119 ka\u017cda proporcja poni\u017cej.\",\"befund_gzip_ok\":\"gzip: {prozent} % rozmiaru po rozpakowaniu ({kb} KB) || Ka\u017cdy klient obs\u0142uguje gzip. To linia bazowa, kt\u00f3r\u0105 powinna osi\u0105ga\u0107 ka\u017cda skompresowana strona.\",\"befund_gzip_andere\":\"\u017b\u0105dano gzip, otrzymano {kodierung} || Serwer odpowiedzia\u0142 kodowaniem, kt\u00f3re nie by\u0142o oferowane. Klienci, kt\u00f3rzy prosili tylko o gzip, nie potrafi\u0105 go rozpakowa\u0107.\",\"befund_gzip_fehlt\":\"Brak gzip dla {kb} KB kompresowalnej tre\u015bci || \u017b\u0105danie tylko z gzip dosta\u0142o nieskompresowan\u0105 tre\u015b\u0107. gzip obs\u0142uguje ka\u017cda przegl\u0105darka i ka\u017cde proxy od lat dziewi\u0119\u0107dziesi\u0105tych; jego pomini\u0119cie kosztuje ca\u0142\u0105 oszcz\u0119dno\u015b\u0107 dla wi\u0119kszo\u015bci klient\u00f3w.\",\"befund_br_ok\":\"Brotli: {prozent} % rozmiaru po rozpakowaniu ({kb} KB) || Brotli obs\u0142uguj\u0105 wszystkie aktualne przegl\u0105darki przez https; na tek\u015bcie oszcz\u0119dza zwykle 10 do 20 % wzgl\u0119dem gzip.\",\"befund_br_groesser_als_gzip\":\"Brotli wi\u0119kszy od gzip o {prozent} % || Brotli na niskim poziomie jako\u015bci albo w locie z ma\u0142ym oknem mo\u017ce przegra\u0107 z dobrze ustawionym gzip. Statyczna kompresja wst\u0119pna z jako\u015bci\u0105 11 to przypadek, w kt\u00f3rym Brotli b\u0142yszczy.\",\"befund_br_gegen_gzip\":\"Brotli oszcz\u0119dza {prozent} % wzgl\u0119dem gzip || R\u00f3\u017cnica mi\u0119dzy dwoma skompresowanymi rozmiarami tego zasobu.\",\"befund_br_fehlt\":\"Brak Brotli || \u017b\u0105danie tylko z Brotli dosta\u0142o nieskompresowan\u0105 tre\u015b\u0107. Ka\u017cda aktualna przegl\u0105darka wysy\u0142a br w Accept-Encoding przez https; w\u0142\u0105czenie go (mod_brotli, ngx_brotli lub prze\u0142\u0105cznik w CDN) zmniejsza zwykle przesy\u0142 tekstu o kolejne 10 do 20 % wzgl\u0119dem gzip.\",\"befund_br_ersetzt\":\"\u017b\u0105dano Brotli, otrzymano {kodierung} || Serwer nie oferuje Brotli i odpowiedzia\u0142 innym, nie\u017c\u0105danym kodowaniem. Rygorystyczni klienci to odrzucaj\u0105.\",\"befund_zstd_ok\":\"zstd: {prozent} % rozmiaru po rozpakowaniu ({kb} KB) || Zstandard kompresuje mniej wi\u0119cej tak dobrze jak Brotli i szybciej rozpakowuje. Chrome i Firefox wysy\u0142aj\u0105 zstd w Accept-Encoding od 2024 roku; Safari nie.\",\"befund_zstd_fehlt\":\"Brak zstd || Dzi\u015b opcjonalne: Chrome i Firefox je przyjmuj\u0105, Safari nie, a zysk wzgl\u0119dem Brotli jest przy typowych stronach ma\u0142y. Op\u0142aca si\u0119 g\u0142\u00f3wnie przy bardzo du\u017cych lub cz\u0119sto zmieniaj\u0105cych si\u0119 odpowiedziach.\",\"befund_zstd_ersetzt\":\"\u017b\u0105dano zstd, otrzymano {kodierung} || Serwer nie oferuje zstd i odpowiedzia\u0142 innym, nie\u017c\u0105danym kodowaniem.\",\"befund_browser_wahl_keine\":\"Przegl\u0105darka nie dostaje kompresji, cho\u0107 {bestes} jest dost\u0119pne || Z \u0142\u0105czonym nag\u0142\u00f3wkiem aktualnych przegl\u0105darek serwer odpowiedzia\u0142 bez kompresji, mimo \u017ce przy pojedynczym kodowaniu kompresowa\u0142. Negocjacja przy kilku ofertach woli identity; to b\u0142\u0105d konfiguracji.\",\"befund_browser_wahl_keine_moeglich\":\"Przegl\u0105darka nie dostaje kompresji || \u0141\u0105czony nag\u0142\u00f3wek nie da\u0142 skompresowanej tre\u015bci, zgodnie z pojedynczymi \u017c\u0105daniami.\",\"befund_browser_wahl_schlechter\":\"Przegl\u0105darka dostaje {wahl}, cho\u0107 {bestes} by\u0142oby mniejsze o {prozent} % || Z \u0142\u0105czonym nag\u0142\u00f3wkiem serwer wybra\u0142 {wahl}. Oferuje te\u017c {bestes}, ale tylko gdy jest \u017c\u0105dane samo. W Apache to kolejno\u015b\u0107 mod_deflate i mod_brotli; w nginx brotli musi by\u0107 w\u0142\u0105czone obok gzip; CDN mo\u017ce wymaga\u0107 ustawienia per typ tre\u015bci.\",\"befund_browser_wahl\":\"Przegl\u0105darka dostaje {wahl} ({prozent} % rozmiaru po rozpakowaniu) || \u0141\u0105czony nag\u0142\u00f3wek aktualnych przegl\u0105darek da\u0142 najlepsze kodowanie, jakie serwer oferuje.\",\"befund_verhaeltnis_schwach\":\"S\u0142aba proporcja: najlepiej {prozent} % rozmiaru po rozpakowaniu || Tekst zwykle kurczy si\u0119 do 20 do 35 %. Proporcja tak bliska 100 % oznacza, \u017ce tre\u015b\u0107 jest ju\u017c zwarta, dominuj\u0105 osadzone dane binarne albo poziom kompresji jest bardzo niski.\",\"befund_vary_stern\":\"Vary: * || Symbol wieloznaczny w Vary czyni odpowied\u017a niemo\u017cliw\u0105 do zapisania w dzielonych pami\u0119ciach podr\u0119cznych. Je\u015bli chodzi\u0142o o Accept-Encoding, wystarczy wymieni\u0107 ten nag\u0142\u00f3wek.\",\"befund_vary_ok\":\"Vary: {vary} || Pami\u0119ci podr\u0119czne trzymaj\u0105 po jednej kopii na kodowanie i nie wydadz\u0105 tre\u015bci Brotli klientowi, kt\u00f3ry prosi\u0142 o gzip.\",\"befund_vary_fehlt\":\"Vary bez Accept-Encoding (znaleziono: {vary}) || Skompresowane odpowiedzi bez Vary: Accept-Encoding pozwalaj\u0105 dzielonej pami\u0119ci podr\u0119cznej zapisa\u0107 jeden wariant i wydawa\u0107 go ka\u017cdemu klientowi, tak\u017ce takiemu, kt\u00f3ry nie potrafi go rozpakowa\u0107. Przegl\u0105darki i CDN-y s\u0105 dzi\u015b pob\u0142a\u017cliwe, proxy i starsze pami\u0119ci podr\u0119czne nie.\",\"befund_etag_gleich\":\"Ten sam ETag dla wszystkich kodowa\u0144 ({etag}) || \u017b\u0105dania warunkowe nie rozr\u00f3\u017cniaj\u0105 kodowa\u0144. Klient, kt\u00f3ry zapisa\u0142 wariant gzip, mo\u017ce dosta\u0107 304 na \u017c\u0105danie Brotli. Apache z tego powodu dokleja -gzip i -br do ETag.\",\"befund_etag_je_kodierung\":\"ETag r\u00f3\u017cny dla ka\u017cdego kodowania || Ka\u017cde kodowanie ma w\u0142asny walidator, \u017c\u0105dania warunkowe pozostaj\u0105 jednoznaczne.\",\"befund_chunked\":\"Przesy\u0142 porcjami (chunked) || Skompresowana tre\u015b\u0107 jest strumieniowana bez Content-Length; serwer kompresuje w locie. Liczba bajt\u00f3w pochodzi z odebranych bajt\u00f3w, nie z nag\u0142\u00f3wka.\",\"befund_content_length\":\"Content-Length {bytes} || Skompresowany rozmiar jest znany z g\u00f3ry, typowe dla plik\u00f3w skompresowanych wst\u0119pnie lub CDN serwuj\u0105cego z pami\u0119ci podr\u0119cznej.\",\"befund_keine_kompression\":\"Brak jakiejkolwiek kompresji dla {kb} KB kompresowalnej tre\u015bci || \u017badne z \u017c\u0105da\u0144 nie dosta\u0142o skompresowanej tre\u015bci. Przy tek\u015bcie oznacza to trzy do pi\u0119ciu razy wi\u0119cej bajt\u00f3w ni\u017c trzeba przy ka\u017cdej wizycie.\",\"befund_zeit_vergleich\":\"Czas \u0142\u0105czny: bez kompresji {identity} ms, {kodierung} {kodiert} ms || Pojedyncze pomiary z pobliskiego serwera przez szybkie \u0142\u0105cze; r\u00f3\u017cnica ro\u015bnie z odleg\u0142o\u015bci\u0105 i w sieciach kom\u00f3rkowych, gdzie liczy si\u0119 liczba bajt\u00f3w.\"};<\/p>\n<p>    var ENDPUNKT = '\/lw-compcheck.php';\n    var SITEKEY = '6LcrPkEtAAAAAPo1QCOf-IIM2fCL0UfdJz4y2iSY';\n    var STUFEN = ['hoch', 'mittel', 'niedrig', 'info', 'gut'];\n    var VARIANTEN = ['identity', 'gzip', 'br', 'zstd', 'browser'];\n    var KLASSEN = ['text', 'schon_komprimiert', 'unbekannt'];<\/p>\n<p>    function liste(w) { return Array.isArray(w) ? w : []; }\n    function zahl(w) { return (typeof w === 'number' && isFinite(w)) ? w : null; }\n    function text(schluessel, daten) {\n        var t = T[schluessel];\n        if (typeof t !== 'string') { return null; }\n        return t.replace(\/\\{([a-z_0-9]+)\\}\/g, function (m, k) {\n            return (daten && daten[k] !== undefined && daten[k] !== null) ? String(daten[k]) : m;\n        });\n    }\n    function kb(bytes) {\n        if (bytes === null) { return '-'; }\n        if (bytes < 1024) { return bytes + ' B'; }\n        if (bytes < 1048576) { return (Math.round(bytes \/ 102.4) \/ 10) + ' KB'; }\n        return (Math.round(bytes \/ 104857.6) \/ 10) + ' MB';\n    }\n\n    function abruf(r) {\n        r = (r &#038;&#038; typeof r === 'object') ? r : {};\n        return { accept: r.accept ? String(r.accept) : '', ok: !!r.ok, status: zahl(r.status), fehler: r.fehler ? String(r.fehler) : null,\n                 kodierung: r.kodierung ? String(r.kodierung) : null, leitung: zahl(r.leitung), entpackt: zahl(r.entpackt), prozent: zahl(r.prozent),\n                 contentLength: zahl(r.content_length), gekappt: !!r.gekappt, ttfb: zahl(r.ttfb_ms), gesamt: zahl(r.gesamt_ms) };\n    }\n\n    function bewerten(antwort) {\n        var a = antwort || {};\n        if (a.fehler) { return { fehler: String(a.fehler), grund: a.grund || null, limit: zahl(a.limit), kette: liste(a.kette) }; }\n        var befunde = liste(a.befunde).map(function (f) {\n            return { key: String(f.key || ''), stufe: STUFEN.indexOf(f.stufe) === -1 ? 'info' : f.stufe, daten: (f.daten &#038;&#038; typeof f.daten === 'object') ? f.daten : {} };\n        });\n        var gruppen = {};\n        STUFEN.forEach(function (s) { gruppen[s] = befunde.filter(function (f) { return f.stufe === s; }); });\n        var abrufe = {};\n        VARIANTEN.forEach(function (v) { abrufe[v] = abruf(a.abrufe ? a.abrufe[v] : null); });\n        return {\n            fehler: null, url: a.url ? String(a.url) : '', host: a.host ? String(a.host) : '', ip: a.ip ? String(a.ip) : '', ips: liste(a.ips), server: a.server ? String(a.server) : null,\n            urteil: (a.urteil === 'gut' || a.urteil === 'warnung' || a.urteil === 'kritisch') ? a.urteil : 'kritisch',\n            klasse: KLASSEN.indexOf(a.klasse) === -1 ? 'unbekannt' : a.klasse,\n            contentType: a.content_type ? String(a.content_type) : null, basis: zahl(a.basis) || 0,\n            abrufe: abrufe, befunde: befunde, gruppen: gruppen,\n            kette: liste(a.kette), dauer: zahl(a.dauer_ms), limitRest: zahl(a.limit_rest)\n        };\n    }\n\n    function skriptLaden() {\n        return new Promise(function (auf) {\n            if (window.grecaptcha) { auf(true); return; }\n            var s = document.createElement('script');\n            s.src = 'https:\/\/www.google.com\/recaptcha\/api.js?render=' + SITEKEY;\n            s.onload = function () { auf(true); }; s.onerror = function () { auf(false); };\n            document.head.appendChild(s);\n            setTimeout(function () { auf(!!window.grecaptcha); }, 8000);\n        });\n    }\n    function tokenHolen() {\n        return skriptLaden().then(function (da) {\n            if (!da || !window.grecaptcha || !window.grecaptcha.ready) { return null; }\n            return new Promise(function (auf) {\n                var fertig = false;\n                function einmal(w) { if (!fertig) { fertig = true; auf(w); } }\n                setTimeout(function () { einmal(null); }, 12000);\n                try {\n                    window.grecaptcha.ready(function () {\n                        if (fertig) { return; }\n                        if (!window.grecaptcha.execute) { einmal(null); return; }\n                        window.grecaptcha.execute(SITEKEY, { action: 'compcheck' }).then(function (t) { einmal(t || null); }, function () { einmal(null); });\n                    });\n                } catch (e) { einmal(null); }\n            });\n        }, function () { return null; });\n    }\n    function abfragen(url) {\n        return tokenHolen().then(function (token) {\n            return fetch(ENDPUNKT, { method: 'POST', headers: { 'Content-Type': 'application\/json' }, body: JSON.stringify({ url: url, token: token || '' }) })\n                .then(function (r) { return r.json().then(function (j) { return j; }, function () { return { fehler: 'antwort' }; }); }, function () { return { fehler: 'netz' }; });\n        });\n    }\n\n    window.LW_TEST = window.LW_TEST || {};\n    window.LW_TEST.CP = { bewerten: bewerten, darstellen: null, text: text, kb: kb, ENDPUNKT: ENDPUNKT, STUFEN: STUFEN, VARIANTEN: VARIANTEN, KLASSEN: KLASSEN, T: T };\n\n    var btn = document.getElementById('cp-btn');\n    var out = document.getElementById('cp-ausgabe');\n    if (!btn || !out) { return; }\n\n    function el(tag, stil, txt) { var e = document.createElement(tag); if (stil) { e.setAttribute('style', stil); } if (txt !== undefined &#038;&#038; txt !== null) { e.textContent = txt; } return e; }\n    function wert(id) { var e = document.getElementById(id); return e ? e.value : ''; }\n    var UEBERSCHRIFT = 'font-family: \"Nunito Sans\", sans-serif; font-weight: 700; color: var(--text-primary, #e8e8ee); font-size: 0.95rem; margin: 22px 0 8px;';\n    var ZELLE = 'padding: 5px 12px 5px 0; color: var(--text-secondary, #a0a0b0); font-size: 0.87rem;';\n    var ZELLE_WERT = 'padding: 5px 12px 5px 0; color: var(--text-primary, #e8e8ee); font-size: 0.87rem; font-family: monospace; word-break: break-all;';\n    var KASTEN = 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-radius: 8px; padding: 14px 16px; margin: 0 0 10px;';\n    var GUT = ' color: #7ee787;', WARN = ' color: #ffa94d;', ROT = ' color: #ff7b72;', GRAU = ' color: #8a8a99;';\n    var FARBEN = { hoch: '#ff7b72', mittel: '#ffa94d', niedrig: '#e3b341', info: '#8a8a99', gut: '#7ee787' };\n    var URTEIL = { gut: GUT, warnung: WARN, kritisch: ROT };\n    function gitter(sp) { return el('div', 'display: grid; grid-template-columns: ' + sp + '; gap: 0 18px; align-items: baseline;'); }\n    function paar(g, n, w, stil) { g.appendChild(el('div', ZELLE, n)); g.appendChild(el('div', ZELLE_WERT + (stil || ''), w)); }\n    function ms(v) { return v === null ? '-' : v + ' ms'; }\n\n    function balken(prozent) {\n        var h = el('div', 'height: 8px; background: var(--border, #2a2a35); border-radius: 4px; width: 140px; overflow: hidden; display: inline-block; vertical-align: middle; margin-right: 8px;');\n        var f = el('div', 'height: 100%; width: ' + Math.max(1, Math.min(100, prozent)) + '%; background: ' + (prozent < 40 ? '#7ee787' : (prozent < 80 ? '#e3b341' : '#ffa94d')) + ';');\n        h.appendChild(f);\n        return h;\n    }\n\n    function darstellen(b, ziel) {\n        ziel.innerHTML = '';\n        if (b.fehler) {\n            var txt = T['fehler_' + b.fehler] || T.fehler_unbekannt;\n            if (b.grund &#038;&#038; T['grund_' + b.grund]) { txt = txt + ' ' + T['grund_' + b.grund]; }\n            if (b.limit !== null) { txt = txt.replace('{limit}', String(b.limit)); }\n            ziel.appendChild(el('p', ZELLE + WARN + ' margin: 0;', txt));\n            return;\n        }\n        ziel.appendChild(el('div', 'font-size: 1.05rem; font-weight: 700; margin: 0 0 12px;' + URTEIL[b.urteil], T['urteil_' + b.urteil]));\n\n        ziel.appendChild(el('div', UEBERSCHRIFT, T.h_antwort));\n        var g = gitter('auto auto');\n        paar(g, T.zeile_url, b.url);\n        paar(g, T.zeile_ip, b.ips.length ? b.ips.join(', ') : b.ip, GRAU);\n        if (b.server) { paar(g, T.zeile_server, b.server, GRAU); }\n        paar(g, T.zeile_typ, (b.contentType || '-') + ' (' + T['klasse_' + b.klasse] + ')', b.klasse === 'text' ? '' : GRAU);\n        paar(g, T.zeile_basis, kb(b.basis) + (b.basis ? ' (' + b.basis + ' B)' : ''));\n        if (b.dauer !== null) { paar(g, T.zeile_dauer, ms(b.dauer), GRAU); }\n        if (b.limitRest !== null) { paar(g, T.zeile_limit, String(b.limitRest), GRAU); }\n        ziel.appendChild(g);\n\n        ziel.appendChild(el('div', UEBERSCHRIFT, T.h_varianten));\n        var huelle = el('div', 'overflow-x: auto;');\n        var gp = gitter('auto auto auto auto auto auto auto');\n        [T.spalte_accept, T.spalte_kodierung, T.spalte_leitung, T.spalte_anteil, T.spalte_status, T.spalte_ttfb, T.spalte_gesamt].forEach(function (s) { gp.appendChild(el('div', ZELLE + ' font-weight: 700; color: var(--text-primary, #e8e8ee); white-space: nowrap;', s)); });\n        VARIANTEN.forEach(function (v) {\n            var r = b.abrufe[v];\n            gp.appendChild(el('div', ZELLE_WERT + ' white-space: nowrap;', r.accept || T['variante_' + v]));\n            if (r.ok) {\n                var kod = r.kodierung || 'identity';\n                gp.appendChild(el('div', ZELLE_WERT + (kod === 'identity' ? GRAU : GUT), kod));\n                gp.appendChild(el('div', ZELLE_WERT, kb(r.leitung) + (r.gekappt ? ' ' + T.gekappt_kurz : '')));\n                var z = el('div', ZELLE_WERT + ' white-space: nowrap;');\n                if (r.prozent !== null) { z.appendChild(balken(r.prozent)); z.appendChild(document.createTextNode(r.prozent + ' %')); } else { z.textContent = '-'; }\n                gp.appendChild(z);\n                gp.appendChild(el('div', ZELLE_WERT + GRAU, r.status === null ? '-' : String(r.status)));\n                gp.appendChild(el('div', ZELLE_WERT + GRAU, ms(r.ttfb)));\n                gp.appendChild(el('div', ZELLE_WERT + GRAU, ms(r.gesamt)));\n            } else {\n                gp.appendChild(el('div', ZELLE_WERT + ROT + ' grid-column: span 6; white-space: normal;', T.fehlgeschlagen + (r.fehler ? ' (' + r.fehler + ')' : '')));\n            }\n        });\n        huelle.appendChild(gp);\n        ziel.appendChild(huelle);\n\n        ziel.appendChild(el('div', UEBERSCHRIFT, T.h_befunde));\n        var irgendwas = false;\n        STUFEN.forEach(function (s) {\n            var gr = b.gruppen[s];\n            if (!gr.length) { return; }\n            irgendwas = true;\n            ziel.appendChild(el('div', 'font-weight: 700; font-size: 0.82rem; text-transform: uppercase; letter-spacing: 0.5px; margin: 14px 0 6px; color: ' + FARBEN[s] + ';', T['stufe_' + s] + ' (' + gr.length + ')'));\n            gr.forEach(function (f) {\n                var k = el('div', KASTEN + ' border-left: 3px solid ' + FARBEN[s] + ';');\n                var t = text('befund_' + f.key, f.daten) || f.key;\n                var teile = t.split(' || ');\n                k.appendChild(el('div', 'color: var(--text-primary, #e8e8ee); font-size: 0.9rem; font-weight: 700;', teile[0]));\n                if (teile[1]) { k.appendChild(el('div', ZELLE + ' padding: 6px 0 0; line-height: 1.55;', teile[1])); }\n                ziel.appendChild(k);\n            });\n        });\n        if (!irgendwas) { ziel.appendChild(el('p', ZELLE + ' margin: 0;', T.keine_befunde)); }\n    }\n    window.LW_TEST.CP.darstellen = darstellen;\n\n    var laeuft = false;\n    btn.addEventListener('click', function () {\n        if (laeuft) { return; }\n        laeuft = true; btn.disabled = true;\n        out.innerHTML = '';\n        out.appendChild(el('p', ZELLE + GRAU + ' margin: 0;', T.laeuft));\n        abfragen(wert('cp-url')).then(function (a) { darstellen(bewerten(a), out); laeuft = false; btn.disabled = false; },\n            function () { darstellen(bewerten({ fehler: 'netz' }), out); laeuft = false; btn.disabled = false; });\n    });\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pobiera adres pi\u0119\u0107 razy z r\u00f3\u017cnymi warto\u015bciami Accept-Encoding i pokazuje, co serwer naprawd\u0119 wysy\u0142a: kt\u00f3re kodowania oferuje, ile bajt\u00f3w idzie \u0142\u0105czem w ka\u017cdym wariancie, co dostaje \u0142\u0105czony nag\u0142\u00f3wek przegl\u0105darki oraz czy Vary i ETag rozdzielaj\u0105 warianty w pami\u0119ciach podr\u0119cznych.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":9284,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[92229,92310,92283],"class_list":["post-15551","page","type-page","status-publish","hentry","tag-devops-pl","tag-networking-pl","tag-web-performance-pl"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Sprawdzanie negocjacji kompresji: gzip, Brotli, zstd - Lukas Wojcik - Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/compression-negotiation-checker-gzip-brotli-zstd\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Sprawdzanie negocjacji kompresji: gzip, Brotli, zstd - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Pobiera adres pi\u0119\u0107 razy z r\u00f3\u017cnymi warto\u015bciami Accept-Encoding i pokazuje, co serwer naprawd\u0119 wysy\u0142a: kt\u00f3re kodowania oferuje, ile bajt\u00f3w idzie \u0142\u0105czem w ka\u017cdym wariancie, co dostaje \u0142\u0105czony nag\u0142\u00f3wek przegl\u0105darki oraz czy Vary i ETag rozdzielaj\u0105 warianty w pami\u0119ciach podr\u0119cznych.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/compression-negotiation-checker-gzip-brotli-zstd\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/compression-negotiation-checker-gzip-brotli-zstd\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/compression-negotiation-checker-gzip-brotli-zstd\\\/\",\"name\":\"Sprawdzanie negocjacji kompresji: gzip, Brotli, zstd - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-09-05T11:31:01+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/compression-negotiation-checker-gzip-brotli-zstd\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/compression-negotiation-checker-gzip-brotli-zstd\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/compression-negotiation-checker-gzip-brotli-zstd\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Toolbox\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/toolbox-3\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Sprawdzanie negocjacji kompresji: gzip, Brotli, zstd\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"luky\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"luky\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Sprawdzanie negocjacji kompresji: gzip, Brotli, zstd - Lukas Wojcik - Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/compression-negotiation-checker-gzip-brotli-zstd\/","og_locale":"en_US","og_type":"article","og_title":"Sprawdzanie negocjacji kompresji: gzip, Brotli, zstd - Lukas Wojcik - Blog","og_description":"Pobiera adres pi\u0119\u0107 razy z r\u00f3\u017cnymi warto\u015bciami Accept-Encoding i pokazuje, co serwer naprawd\u0119 wysy\u0142a: kt\u00f3re kodowania oferuje, ile bajt\u00f3w idzie \u0142\u0105czem w ka\u017cdym wariancie, co dostaje \u0142\u0105czony nag\u0142\u00f3wek przegl\u0105darki oraz czy Vary i ETag rozdzielaj\u0105 warianty w pami\u0119ciach podr\u0119cznych.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/compression-negotiation-checker-gzip-brotli-zstd\/","og_site_name":"Lukas Wojcik - Blog","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/compression-negotiation-checker-gzip-brotli-zstd\/","url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/compression-negotiation-checker-gzip-brotli-zstd\/","name":"Sprawdzanie negocjacji kompresji: gzip, Brotli, zstd - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-09-05T11:31:01+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/compression-negotiation-checker-gzip-brotli-zstd\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/compression-negotiation-checker-gzip-brotli-zstd\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/compression-negotiation-checker-gzip-brotli-zstd\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Toolbox","item":"https:\/\/www.lukaswojcik.com\/blog\/toolbox-3\/"},{"@type":"ListItem","position":3,"name":"Sprawdzanie negocjacji kompresji: gzip, Brotli, zstd"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"luky","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"luky"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/15551","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=15551"}],"version-history":[{"count":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/15551\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/9284"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=15551"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=15551"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}