{"id":2125,"date":"2026-06-01T10:12:00","date_gmt":"2026-06-01T09:12:00","guid":{"rendered":"https:\/\/jalvo.eu\/reverse-proxy-kiedy-pomaga-kiedy-zakrywa-problem\/"},"modified":"2026-06-01T10:12:00","modified_gmt":"2026-06-01T09:12:00","slug":"reverse-proxy-kiedy-pomaga-kiedy-zakrywa-problem","status":"publish","type":"post","link":"https:\/\/jalvo.eu\/pl\/reverse-proxy-kiedy-pomaga-kiedy-zakrywa-problem\/","title":{"rendered":"Kiedy reverse proxy jest dobrym rozwi\u0105zaniem, a kiedy zakrywa problem"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Ma\u0142o kt\u00f3ry element infrastruktury trafia do wdro\u017cenia tak bezrefleksyjnie jak reverse proxy. Pojawia si\u0119 w pierwszym sprincie nowego wdro\u017cenia, przejmuje certyfikat TLS, dostaje jedn\u0105 regu\u0142\u0119 routingu, a potem przez lata po cichu zbiera kolejne dyrektywy. Wi\u0119kszo\u015b\u0107 z nich to rozs\u0105dne decyzje infrastrukturalne.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cz\u0119\u015b\u0107 to blizny: obej\u015bcie, kt\u00f3re kto\u015b napisa\u0142 o trzeciej w nocy, \u017ceby uciszy\u0107 alert, i do kt\u00f3rego nikt nie wr\u00f3ci\u0142, gdy tylko presja opad\u0142a. Odr\u00f3\u017cnienie jednego od drugiego to jeden z bardziej op\u0142acalnych audyt\u00f3w, jakie mo\u017ce przeprowadzi\u0107 zesp\u00f3\u0142 in\u017cynierski, bo proxy, kt\u00f3re ukrywa usterki, b\u0119dzie je ukrywa\u0107 do momentu, a\u017c popsuje si\u0119 co\u015b wi\u0119kszego. Szczeg\u00f3lnie uwa\u017cnie warto przejrze\u0107 regu\u0142y <a href=\"https:\/\/jalvo.eu\/pl\/cache-reverse-proxy-a-seo-bez-nieaktualnych-stron\/\">cache w reverse proxy<\/a>, bo \u017ale ustawione potrafi\u0105 d\u0142ugo serwowa\u0107 robotom wyszukiwarek nieaktualne strony.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Co reverse proxy naprawd\u0119 robi<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u015bli odrzuci\u0107 \u017cargon, reverse proxy jest po\u015brednikiem. Ko\u0144czy po\u0142\u0105czenie klienta i otwiera w\u0142asne po\u0142\u0105czenie do jednej lub kilku us\u0142ug upstream. Klient my\u015bli, \u017ce rozmawia z twoj\u0105 aplikacj\u0105. Rozmawia z programem, kt\u00f3ry decyduje, gdzie \u017c\u0105danie pow\u0119druje dalej. Forward proxy stoi po stronie klienta i reprezentuje ruch wychodz\u0105cy u\u017cytkownik\u00f3w. Load balancer rozk\u0142ada ruch na r\u00f3wnorz\u0119dne backendy. API gateway dok\u0142ada uwierzytelnianie, limity i kwestie schematu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Implementacje mocno si\u0119 pokrywaj\u0105 - ta sama binarka cz\u0119sto pe\u0142ni kilka z tych r\u00f3l naraz - ale intencja jest inna, a mieszanie intencji to prosta droga do konfiguracji, kt\u00f3rej nikt nie umie przeczyta\u0107. Rola po\u015brednika ma te\u017c uboczny skutek, bo aplikacja widzi adres proxy zamiast adresu u\u017cytkownika, wi\u0119c od pocz\u0105tku trzeba zadba\u0107 o <a href=\"https:\/\/jalvo.eu\/pl\/prawdziwe-ip-klienta-za-reverse-proxy\/\">przekazywanie prawdziwego IP klienta<\/a>. Kiedy proxy ko\u0144czy ka\u017cde po\u0142\u0105czenie i otwiera w\u0142asne do upstreamu, dok\u0142ada te\u017c sw\u00f3j odcinek do czasu odpowiedzi, dlatego warto sprawdzi\u0107, <a href=\"https:\/\/jalvo.eu\/pl\/ttfb-reverse-proxy-czy-proxy-spowalnia-strone\/\">jak reverse proxy wp\u0142ywa na TTFB<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zestaw podstawowych funkcji jest niewielki i niewiele si\u0119 zmieni\u0142: terminacja TLS, routing \u017c\u0105da\u0144 po ho\u015bcie lub \u015bcie\u017cce, przepisywanie nag\u0142\u00f3wk\u00f3w, pula po\u0142\u0105cze\u0144 do upstreamu, buforowanie odpowiedzi i cache. Jakiekolwiek oprogramowanie wstawisz w to miejsce, zajmuje ono t\u0119 sam\u0105 pozycj\u0119 w architekturze. A pozycja ta sta\u0142a si\u0119 domy\u015blnym pierwszym przystankiem, bo prawie ka\u017cde wdro\u017cenie pr\u0119dzej czy p\u00f3\u017aniej potrzebuje co najmniej dw\u00f3ch z tych funkcji, a nikt nie chce budowa\u0107 ich po raz drugi w kodzie aplikacji. Je\u015bli konfigurujesz je od zera, <a href=\"https:\/\/jalvo.eu\/pl\/#how\">instrukcja krok po kroku<\/a> oszcz\u0119dza odkrywania tych samych ustawie\u0144 domy\u015blnych metod\u0105 pr\u00f3b i b\u0142\u0119d\u00f3w.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Sytuacje, w kt\u00f3rych reverse proxy jest w\u0142a\u015bciwym narz\u0119dziem<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Terminacja TLS w jednym miejscu to argument najmocniejszy, bezdyskusyjnie. Certyfikaty, polityka szyfr\u00f3w i automatyczne odnawianie \u017cyj\u0105 poza kodem aplikacji, wi\u0119c aktualizacja \u015brodowiska uruchomieniowego j\u0119zyka nigdy nie zagrozi konfiguracji handshake&#8217;u. Drugi to serwowanie kilku aplikacji spod jednego publicznego adresu i portu, z routingiem po nazwie hosta albo prefiksie. Trzeci, niedoceniany, to buforowanie: backend przywi\u0105zany do w\u0105tku lub procesu, zaj\u0119ty przez klienta s\u0105cz\u0105cego bajty przez po\u0142\u0105czenie kom\u00f3rkowe, to zmarnowana moc przerobowa, a po\u015brednik, kt\u00f3ry przyjmie na siebie wolnego klienta, oddaje t\u0119 moc z powrotem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Poza tym proxy nie budzi kontrowersji w takich sytuacjach:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Zasoby statyczne, \u017c\u0105dania zakresu bajt\u00f3w i kompresja, obs\u0142ugiwane przez oprogramowanie napisane specjalnie do tego<\/li>\n<li>Wdro\u017cenia blue-green i canary, kt\u00f3re prze\u0142\u0105czaj\u0105 ruch bez ruszania logiki aplikacji<\/li>\n<li>Wygaszanie trwaj\u0105cych po\u0142\u0105cze\u0144 podczas wdro\u017cenia, \u017ceby nikt nie zobaczy\u0142 zerwanej sesji<\/li>\n<li>Limitowanie ruchu i polityka dost\u0119pu na poziomie IP, kt\u00f3ra musi zadzia\u0142a\u0107 przed uruchomieniem jakiegokolwiek kodu<\/li>\n<li>Zebranie log\u00f3w dost\u0119pu z r\u00f3\u017cnorodnych us\u0142ug w jednym miejscu<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Wskaz\u00f3wka:<\/strong> trzymaj konfiguracj\u0119 proxy w tym samym repozytorium i tym samym procesie przegl\u0105du co kod aplikacji. Konfiguracja, kt\u00f3ra omija przegl\u0105d, to konfiguracja, kt\u00f3rej nikt nie pami\u0119ta.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Maskowanie objaw\u00f3w: proxy jako \u015brodek przeciwb\u00f3lowy<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Oto cz\u0119sty antywzorzec. Endpoint zwalnia, wi\u0119c kto\u015b podnosi timeout odczytu na proxy. Alert milknie. W rzeczywisto\u015bci szybka i czytelna awaria zamieni\u0142a si\u0119 w d\u0142ugie zawieszenie, a ka\u017cdy klient trzyma teraz otwarte po\u0142\u0105czenie znacznie d\u0142u\u017cej, podczas gdy wolne zapytanie le\u017cy sobie nietkni\u0119te. Ponawianie skonfigurowane na warstwie proxy tylko pogarsza spraw\u0119: i tak ju\u017c przeci\u0105\u017cony upstream dostaje zdublowany ruch, a w sprzyjaj\u0105cych warunkach wolumen ponowie\u0144 zaczyna si\u0119 sam nap\u0119dza\u0107. To ten sam odruch, kt\u00f3ry w SEO ka\u017ce si\u0119ga\u0107 po <a href=\"https:\/\/jalvo.eu\/pl\/kiedy-uzywac-narzedzia-disavow\/\">odrzucanie link\u00f3w przez Disavow<\/a>, zamiast najpierw zrozumie\u0107, sk\u0105d naprawd\u0119 wzi\u0105\u0142 si\u0119 problem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Na szczeg\u00f3ln\u0105 nieufno\u015b\u0107 zas\u0142uguje cache. Zakeszowanie odpowiedzi, kt\u00f3ra jest zepsuta albo niedeterministyczna, nie naprawia jej. Sprawia tylko, \u017ce usterka wychodzi wy\u0142\u0105cznie przy chybieniu cache&#8217;a, a trudniej odtwarzalnego profilu b\u0142\u0119du raczej nie ma. Przepisywanie nag\u0142\u00f3wk\u00f3w i \u015bcie\u017cek, kt\u00f3re kompensuje generowanie z\u0142ych adres\u00f3w przez aplikacj\u0119, przenosi b\u0142\u0105d z miejsca obj\u0119tego testami do miejsca bez test\u00f3w. Buforowanie potrafi ukry\u0107 backend \u017ale obs\u0142uguj\u0105cy strumieniowanie - dok\u0142adnie do chwili, gdy \u0142adunek przekroczy rozmiar bufora i zachowanie zmieni si\u0119 bez \u017cadnego ostrze\u017cenia.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Jak odr\u00f3\u017cni\u0107 napraw\u0119 od plastra<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Trzy pytania oddzielaj\u0105 realn\u0105 polityk\u0119 infrastrukturaln\u0105 od zamiatania pod dywan. Zadaj je, zanim jakakolwiek zmiana w proxy trafi do ga\u0142\u0119zi g\u0142\u00f3wnej.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Czy zmiana dotyka tylko obserwowanego zachowania, czy samej przyczyny?<\/strong> Je\u015bli backend nadal robi co\u015b \u017ale, a klient po prostu przestaje to zauwa\u017ca\u0107, masz plaster.<\/li>\n<li><strong>Czy usuni\u0119cie tej dyrektywy natychmiast przywr\u00f3ci\u0142oby pierwotn\u0105 awari\u0119?<\/strong> Uczciwe \u201etak\u201d oznacza, \u017ce dyrektywa jest no\u015bna dla usterki, a nie dla architektury.<\/li>\n<li><strong>Czy to element polityki, czy obej\u015bcie?<\/strong> Minimalna wersja TLS, limity ruchu i maksymalny rozmiar tre\u015bci to polityka. Timeout podniesiony pod jeden endpoint ju\u017c nie.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Wskaz\u00f3wka:<\/strong> ka\u017cdej dyrektywie b\u0119d\u0105cej obej\u015bciem przypisz w\u0142a\u015bciciela i warunek usuni\u0119cia, a nie sam\u0105 dat\u0119. Daty mijaj\u0105 po cichu, warunki da si\u0119 przetestowa\u0107.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Obserwowalno\u015b\u0107: dlaczego proxy jednocze\u015bnie pomaga i za\u015blepia<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Proxy to najlepszy punkt obserwacyjny dla liczby \u017c\u0105da\u0144, rozk\u0142adu kod\u00f3w statusu i op\u00f3\u017anienia end-to-end, bo widzi ka\u017cde \u017c\u0105danie niezale\u017cnie od tego, czy backend je prze\u017cy\u0142. Ta zaleta ma sw\u00f3j odpowiednik po stronie wad. Odr\u0119bne awarie upstreamu zlewaj\u0105 si\u0119 w og\u00f3lne statusy bramy, wi\u0119c odmowa po\u0142\u0105czenia, timeout i zniekszta\u0142cona odpowied\u017a l\u0105duj\u0105 na dashboardzie z tym samym numerem. Pierwotna przyczyna znika, chyba \u017ce \u015bwiadomie j\u0105 zachowasz.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Adres klienta, protok\u00f3\u0142 i oryginalny host te\u017c znikaj\u0105, chyba \u017ce nag\u0142\u00f3wki przekazywania s\u0105 poprawnie ustawione i - co r\u00f3wnie wa\u017cne - honorowane tylko od znanych po\u015brednik\u00f3w. Ta sama \u015blepa plamka pojawia si\u0119 w metadanych infrastruktury: <a href=\"https:\/\/jalvo.eu\/pl\/reverse-dns-i-rekordy-ptr-ignorowany-sygnal\/\">co zdradzaj\u0105 twoje rekordy PTR<\/a> o wdro\u017ceniu, bywa jedyn\u0105 zewn\u0119trzn\u0105 wskaz\u00f3wk\u0105, kt\u00f3ry host faktycznie stoi za danym adresem. Kontekst \u015bledzenia trzeba propagowa\u0107 jawnie, inaczej ka\u017cde \u017c\u0105danie w rozproszonych \u015bladach wygl\u0105da, jakby zacz\u0119\u0142o si\u0119 na proxy, co przerywa \u0142a\u0144cuch dok\u0142adnie tam, gdzie jest najwa\u017cniejszy. Por\u00f3wnanie op\u00f3\u017anienia widzianego przez proxy z op\u00f3\u017anieniem widzianym po stronie upstreamu ujawnia kolejkowanie. Gdy r\u00f3\u017cnica ro\u015bnie, \u017c\u0105dania gdzie\u015b czekaj\u0105, a ta r\u00f3\u017cnica m\u00f3wi wi\u0119cej ni\u017c ka\u017cda z tych liczb osobno.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Wskaz\u00f3wka:<\/strong> loguj czas nawi\u0105zania po\u0142\u0105czenia z upstreamem, czas do nag\u0142\u00f3wk\u00f3w i pe\u0142ny czas odpowiedzi jako osobne pola, a nie jeden zbiorczy czas trwania.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Awarie, kt\u00f3re dok\u0142ada sama warstwa proxy<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dodanie warstwy dodaje zale\u017cno\u015b\u0107, w tym zale\u017cno\u015b\u0107 od tego, jak zachowuje si\u0119 ona przy prze\u0142adowaniu konfiguracji. Poza tym kilka tryb\u00f3w awarii wynika wprost z zajmowanej przez ni\u0105 pozycji:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Niedopasowane timeouty.<\/strong> Gdy proxy poddaje si\u0119 przed upstreamem, a upstream przed baz\u0105 danych, praca mieli si\u0119 dalej dla \u017c\u0105dania, na kt\u00f3re nikt ju\u017c nie czeka.<\/li>\n<li><strong>Keepalive i ponowne u\u017cycie po\u0142\u0105cze\u0144.<\/strong> Po\u0142\u0105czenia z puli potrafi\u0105 trafi\u0107 z \u017c\u0105daniem do backendu, kt\u00f3ry ju\u017c zacz\u0105\u0142 si\u0119 wygasza\u0107.<\/li>\n<li><strong>Limity rozmiaru.<\/strong> Ograniczenia nag\u0142\u00f3wk\u00f3w, tre\u015bci i bufor\u00f3w wywalaj\u0105 si\u0119 tylko przy najwi\u0119kszych poprawnych \u017c\u0105daniach, czyli przechodz\u0105 przez ka\u017cdy zestaw test\u00f3w.<\/li>\n<li><strong>Rozbie\u017cne ramkowanie.<\/strong> Gdy proxy i upstream inaczej rozpoznaj\u0105 granice \u017c\u0105da\u0144, otwiera si\u0119 mo\u017cliwo\u015b\u0107 przemycania \u017c\u0105da\u0144.<\/li>\n<li><strong>Przypadki brzegowe certyfikat\u00f3w i SNI.<\/strong> Uderzaj\u0105 w cz\u0119\u015b\u0107 klient\u00f3w, cz\u0119sto tych starszych, i nigdy w twojej przegl\u0105darce.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Wskaz\u00f3wka:<\/strong> ustaw timeouty upstreamu kr\u00f3cej ni\u017c timeouty proxy, \u017ceby to \u017ar\u00f3d\u0142o pada\u0142o pierwsze i m\u00f3wi\u0142o dlaczego, zamiast zostawia\u0107 ci go\u0142y b\u0142\u0105d bramy.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Praktyczna procedura przegl\u0105du istniej\u0105cych konfiguracji proxy<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Zacznij od spisania ka\u017cdej dyrektywy odbiegaj\u0105cej od domy\u015blnych ustawie\u0144 producenta, a potem zapytaj, jaki incydent stoi za ka\u017cd\u0105 z nich. Je\u015bli nikt nie pami\u0119ta, to ju\u017c jest ustalenie. Posortuj wyniki na trzy kategorie - \u015bwiadoma polityka, strojenie wydajno\u015bci i obej\u015bcie - a t\u0119 trzeci\u0105 potraktuj jak d\u0142ug z realnym kosztem. Zespo\u0142y, kt\u00f3re nie maj\u0105 czasu robi\u0107 tego same, mog\u0105 odda\u0107 audyt komu\u015b, kto robi to w ramach przegl\u0105du infrastruktury.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Usuni\u0119cie podejrzanych obej\u015b\u0107 przetestuj na \u015brodowisku staging, u\u017cywaj\u0105c realistycznych rozmiar\u00f3w \u0142adunku i wolnych klient\u00f3w, a nie porz\u0105dnych syntetycznych \u017c\u0105da\u0144. Wi\u0119kszo\u015b\u0107 zamaskowanych usterek wraca dopiero w realistycznych warunkach. To, co przetrwa, \u015bled\u017a w tym samym backlogu co b\u0142\u0119dy aplikacji, \u017ceby te pozycje walczy\u0142y o realny priorytet, zamiast siedzie\u0107 w dokumencie infrastrukturalnym, kt\u00f3rego nikt nie otwiera.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Wskaz\u00f3wka:<\/strong> gdy obej\u015bcie musi zosta\u0107, podepnij pod nie alert, kt\u00f3ry odpali, je\u015bli maskowany stan si\u0119 pogorszy. Podniesiony timeout jest do zniesienia, je\u015bli dowiesz si\u0119, kiedy op\u00f3\u017anienie u podstawy si\u0119 podwoi.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Wybieraj \u015bwiadomie, nie odruchowo<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ma\u0142e wdro\u017cenia mog\u0105 spokojnie od\u0142o\u017cy\u0107 t\u0119 warstw\u0119 do czasu, a\u017c uzasadni j\u0105 z\u0142o\u017cono\u015b\u0107 routingu albo certyfikat\u00f3w. Dodanie jej wcze\u015bnie kupuje elastyczno\u015b\u0107, kt\u00f3rej mo\u017cesz nie potrzebowa\u0107, i powierzchni\u0119, kt\u00f3r\u0105 i tak trzeba utrzymywa\u0107. Kiedykolwiek ju\u017c j\u0105 do\u0142o\u017cysz, trzymaj ka\u017cd\u0105 dyrektyw\u0119 przy jednym standardzie: nowy in\u017cynier powinien w nieca\u0142\u0105 minut\u0119 wywnioskowa\u0107, po co ona tam jest. Wszystko, co tego testu nie przechodzi, jest albo nieudokumentowan\u0105 polityk\u0105, albo usterk\u0105 w przebraniu, a jedno i drugie warto znale\u017a\u0107, zanim znajdzie je za ciebie incydent. Wi\u0119cej notatek o <a href=\"https:\/\/jalvo.eu\/pl\/category\/ogolne\/\">codziennych decyzjach infrastrukturalnych<\/a> trzyma si\u0119 tej samej zasady.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ma\u0142o kt\u00f3ry element infrastruktury trafia do wdro\u017cenia tak bezrefleksyjnie jak reverse proxy. Pojawia si\u0119 w pierwszym sprincie nowego wdro\u017cenia, przejmuje certyfikat TLS, dostaje jedn\u0105 regu\u0142\u0119 routingu, a potem przez lata po cichu zbiera kolejne dyrektywy. Wi\u0119kszo\u015b\u0107 z nich to rozs\u0105dne decyzje infrastrukturalne. Cz\u0119\u015b\u0107 to blizny: obej\u015bcie, kt\u00f3re kto\u015b napisa\u0142 o trzeciej w nocy, \u017ceby uciszy\u0107 [&hellip;]<\/p>\n","protected":false},"author":25,"featured_media":2093,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[182],"tags":[217,227,237,247,32,37,259,257],"class_list":["post-2125","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-seo-pl","tag-architektura","tag-devops-x","tag-infrastruktura","tag-nginx-x","tag-odwrotne-proxy","tag-rownowazenie-obciazenia","tag-serwery-www","tag-tls-x"],"acf":[],"_links":{"self":[{"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/posts\/2125","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/users\/25"}],"replies":[{"embeddable":true,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/comments?post=2125"}],"version-history":[{"count":0,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/posts\/2125\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/media\/2093"}],"wp:attachment":[{"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/media?parent=2125"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/categories?post=2125"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/tags?post=2125"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}