{"id":2218,"date":"2026-01-09T09:38:00","date_gmt":"2026-01-09T08:38:00","guid":{"rendered":"https:\/\/jalvo.eu\/wordpress-za-reverse-proxy-przekierowania-i-https\/"},"modified":"2026-09-25T03:46:35","modified_gmt":"2026-09-25T02:46:35","slug":"wordpress-za-reverse-proxy-przekierowania-i-https","status":"publish","type":"post","link":"https:\/\/jalvo.eu\/pl\/wordpress-za-reverse-proxy-przekierowania-i-https\/","title":{"rendered":"WordPress za reverse proxy: jak naprawi\u0107 przekierowania i HTTPS"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">WordPress za reverse proxy psuje si\u0119 z jednego prostego powodu: WordPress nie widzi protoko\u0142u ani hosta, z kt\u00f3rych naprawd\u0119 skorzysta\u0142 odwiedzaj\u0105cy. Trzeba wi\u0119c przekaza\u0107 te informacje z warstwy proxy i pozwoli\u0107, \u017ceby wp-config.php je odczyta\u0142. Tak naprawd\u0119 to ca\u0142a poprawka. Utkn\u0105\u0142e\u015b w nieko\u0144cz\u0105cych si\u0119 przekierowaniach w wp-admin? Przegl\u0105darka ostrzega przed mixed content? Mapa strony jest pe\u0142na link\u00f3w http:\/\/ i adresu IP serwera origin? Poni\u017cej przechodz\u0119 po kolei przez konfiguracj\u0119 NGINX na serwerze origin, wp-config.php, ustawienia adresu strony, czyszczenie bazy danych i ko\u0144cowe sprawdzenie.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Dlaczego WordPress za reverse proxy \u017ale obs\u0142uguje przekierowania i HTTPS?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">WordPress ocenia, czy \u017c\u0105danie jest bezpieczne, na podstawie w\u0142asnych zmiennych serwera. Odwiedzaj\u0105cy \u0142\u0105czy si\u0119 przez HTTPS, proxy rozmawia z serwerem origin zwyk\u0142ym HTTP, a WordPress widzi wy\u0142\u0105cznie ten drugi, nieszyfrowany odcinek. Dlatego w k\u00f3\u0142ko odsy\u0142a przegl\u0105dark\u0119 do wersji HTTPS strony, kt\u00f3r\u0105 uwa\u017ca za niezabezpieczon\u0105. I tak bez ko\u0144ca. <a href=\"https:\/\/developer.wordpress.org\/advanced-administration\/security\/https\/\" rel=\"nofollow noopener\" target=\"_blank\">Poradnik WordPressa o HTTPS<\/a> m\u00f3wi to wprost: proxy, kt\u00f3re zapewnia SSL przed serwerem origin bez SSL, wpycha \u017c\u0105dania w niesko\u0144czon\u0105 p\u0119tl\u0119 przekierowa\u0144, gdy tylko w\u0142\u0105czysz FORCE_SSL_ADMIN. Ta sama strona zwraca te\u017c uwag\u0119, \u017ce proxy pass przekazuje \u017c\u0105danie, ale nie nag\u0142\u00f3wki, kt\u00f3rych WordPress potrzebuje do przekierowa\u0144. Musisz doda\u0107 je sam. (Nie masz pewno\u015bci, czy taka architektura pasuje do Twojej strony? Najpierw przeczytaj, <a href=\"https:\/\/jalvo.eu\/reverse-proxy-right-answer-or-hidden-problem\/\">kiedy reverse proxy ma sens<\/a>.)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Krok 1: przeka\u017c w\u0142a\u015bciwe nag\u0142\u00f3wki z NGINX do serwera origin<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Zacznij od serwera NGINX, kt\u00f3ry kontrolujesz i kt\u00f3ry stoi przed WordPressem. Ka\u017cda lokalizacja obs\u0142ugiwana przez proxy musi przekazywa\u0107 oryginalny host i schemat, bez wyj\u0105tk\u00f3w. Dodaj te dyrektywy do bloku location, kt\u00f3ry przekazuje ruch:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>proxy_set_header Host $host;<\/strong> zachowuje publiczn\u0105 domen\u0119 zamiast nazwy upstreamu.<\/li>\n<li><strong>proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<\/strong> przekazuje adres odwiedzaj\u0105cego dalej w \u0142a\u0144cuchu.<\/li>\n<li><strong>proxy_set_header X-Forwarded-Proto $scheme;<\/strong> informuje serwer origin, czy odwiedzaj\u0105cy przyszed\u0142 przez HTTP, czy przez HTTPS.<\/li>\n<li><strong>proxy_set_header X-Forwarded-Host $host;<\/strong> przydaje si\u0119, gdy serwer origin obs\u0142uguje kilka nazw albo stoi za jeszcze jedn\u0105 warstw\u0105.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">A co z przekierowaniami, kt\u00f3re zdradzaj\u0105 adres upstreamu? To te\u017c da si\u0119 za\u0142atwi\u0107. W <a href=\"https:\/\/nginx.org\/en\/docs\/http\/ngx_http_proxy_module.html\" rel=\"nofollow noopener\" target=\"_blank\">dokumentacji modu\u0142u proxy NGINX<\/a> jest wyja\u015bnione, \u017ce proxy_redirect przepisuje nag\u0142\u00f3wki Location i potrafi doda\u0107 nazw\u0119 hosta do wzgl\u0119dnych przekierowa\u0144 z serwera za proxy. Jednego bym si\u0119 trzyma\u0142 bezwzgl\u0119dnie: ufaj przekazanym nag\u0142\u00f3wkom tylko wtedy, gdy przychodz\u0105 ze znanych adres\u00f3w proxy. Niezale\u017cnie od tego, z jakiej us\u0142ugi korzystasz do <a href=\"https:\/\/jalvo.eu\/services\/\">kierowania WordPressa na IP proxy<\/a>, we\u017a list\u0119 tych adres\u00f3w i nie pozw\u00f3l, \u017ceby ktokolwiek inny ustawia\u0142 warto\u015bci X-Forwarded-*. Nag\u0142\u00f3wek mo\u017ce wys\u0142a\u0107 ka\u017cdy.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Krok 2: naucz wp-config.php czyta\u0107 HTTP_X_FORWARDED_PROTO<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">P\u0119tla przekierowa\u0144 znika, gdy wp-config.php oznacza \u017c\u0105danie jako bezpieczne za ka\u017cdym razem, kiedy proxy zg\u0142asza HTTPS. Wklej ten fragment nad lini\u0105 &#8222;That&#8217;s all, stop editing&#8221;:<\/p>\n\n\n\n<pre><code>if ( isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] )\n    &amp;&amp; $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https' ) {\n    $_SERVER['HTTPS'] = 'on';\n}\ndefine( 'FORCE_SSL_ADMIN', true );<\/code><\/pre>\n<p class=\"wp-block-paragraph\">Sta\u0142e takie jak FORCE_SSL_ADMIN umieszcza si\u0119 w wp-config.php. Nie we wtyczce. Dokumentacja WordPressa m\u00f3wi, \u017ce zdefiniowanie ich we wtyczce nie wystarczy, a ludzie i tak pr\u00f3buj\u0105. \u017beby zablokowa\u0107 podszywanie si\u0119, otocz ten test warunkiem, kt\u00f3ry por\u00f3wnuje <em>$_SERVER[&#8217;REMOTE_ADDR&#8217;]<\/em> z adresami Twojego proxy. Sk\u0105d wiadomo, \u017ce zadzia\u0142a\u0142o? wp-admin \u0142aduje si\u0119 raz, bez skakania mi\u0119dzy adresami URL.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Krok 3: ustaw adres strony WordPressa za proxy<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Zdefiniuj WP_HOME i WP_SITEURL w wp-config.php z publiczn\u0105 domen\u0105 HTTPS. Nigdy z IP serwera origin, nigdy z wewn\u0119trzn\u0105 nazw\u0105 hosta. WordPress buduje z tych dw\u00f3ch warto\u015bci ka\u017cdy link bezwzgl\u0119dny, wi\u0119c jeden b\u0142\u0119dny wpis rozlewa si\u0119 jednocze\u015bnie na map\u0119 strony, tagi canonical i kana\u0142 RSS:<\/p>\n\n\n\n<pre><code>define( 'WP_HOME', 'https:\/\/example.com' );\ndefine( 'WP_SITEURL', 'https:\/\/example.com' );<\/code><\/pre>\n<p class=\"wp-block-paragraph\">Potem wy\u0142ap wszystko, co zapami\u0119ta\u0142o stary adres. Wtyczki SEO cz\u0119sto trzymaj\u0105 wygenerowan\u0105 map\u0119 strony, kt\u00f3r\u0105 trzeba wygenerowa\u0107 od nowa. Zapisanie ustawie\u0144 bezpo\u015brednich odno\u015bnik\u00f3w od\u015bwie\u017ca regu\u0142y przepisywania. A motywy? Niekt\u00f3re trzymaj\u0105 w opcjach w\u0142asn\u0105 kopi\u0119 adresu strony, co jest irytuj\u0105ce, ale cz\u0119ste. Ta sama dyscyplina obowi\u0105zuje przy <a href=\"https:\/\/jalvo.eu\/ip-migration-without-losing-rankings\/\">przenoszeniu stron mi\u0119dzy pulami IP<\/a>, bo wyszukiwarki podchwytuj\u0105 ka\u017cdy URL, kt\u00f3ry pokazuj\u0105 Twoje strony.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Jak naprawi\u0107 mixed content po przej\u015bciu na proxy?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Mixed content po prze\u0142\u0105czeniu na proxy bierze si\u0119 z adres\u00f3w http:\/\/ zapisanych w bazie danych. To nie proxy jest tu winne. Wpisy, opcje i wid\u017cety przechowuj\u0105 adres, kt\u00f3ry obowi\u0105zywa\u0142 w chwili ich zapisania. Przejd\u017a przez te punkty:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Najpierw zr\u00f3b kopi\u0119 zapasow\u0105 bazy. Potem uruchom <em>wp search-replace 'http:\/\/example.com&#8217; 'https:\/\/example.com&#8217; -dry-run<\/em>, \u017ceby podejrze\u0107 zmiany, zanim wprowadzisz je naprawd\u0119.<\/li>\n<li>Sprawd\u017a opcje motywu i dane page buildera, kt\u00f3re uwielbiaj\u0105 trzyma\u0107 w\u0142asne kopie adres\u00f3w obrazk\u00f3w i link\u00f3w.<\/li>\n<li>Zaktualizuj zaszyte na sztywno adresy zasob\u00f3w w motywach potomnych, w\u0142asnym CSS i skryptach w nag\u0142\u00f3wku.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">U\u017cywaj wp-cli, a nie surowego SQL. WordPress przechowuje dane serializowane ze znacznikami d\u0142ugo\u015bci, a zwyk\u0142a podmiana tekstu je uszkodzi (zapytaj kogokolwiek, kto musia\u0142 r\u0119cznie odbudowywa\u0107 obszar wid\u017cet\u00f3w). Je\u015bli w gr\u0119 wchodz\u0105 certyfikaty albo zewn\u0119trzne hosty zasob\u00f3w, przejrzyj te\u017c swoje <a href=\"https:\/\/jalvo.eu\/ssl-cdn-footprints\/\">\u015blady TLS i CDN<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Weryfikacja konfiguracji i najcz\u0119stsze b\u0142\u0119dy<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Sprawd\u017a poprawk\u0119 z zewn\u0105trz, tak jak widz\u0105 stron\u0119 odwiedzaj\u0105cy i crawler. Uruchom <em>curl -IL<\/em> na publicznym adresie URL i prze\u015bled\u017a \u0142a\u0144cuch przekierowa\u0144. Powinien ko\u0144czy\u0107 si\u0119 na jednej stronie HTTPS. Otw\u00f3rz konsol\u0119 przegl\u0105darki i poszukaj ostrze\u017ce\u0144 o mixed content. Potem wczytaj map\u0119 strony i upewnij si\u0119, \u017ce ka\u017cdy wpis u\u017cywa HTTPS i publicznego hosta.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u015bli nadal nie dzia\u0142a, zwykle winny jest jeden z kilku b\u0142\u0119d\u00f3w:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Wymuszanie HTTPS jednocze\u015bnie w NGINX i we wtyczce WordPressa. Dwa zestawy przekierowa\u0144, kt\u00f3re walcz\u0105 ze sob\u0105.<\/li>\n<li>Edycja konfiguracji bez prze\u0142adowania NGINX. Zdarza si\u0119 cz\u0119\u015bciej, ni\u017c ktokolwiek przyznaje.<\/li>\n<li>Ustawienie nag\u0142\u00f3wk\u00f3w tylko w jednym bloku location, przez co \u017c\u0105dania PHP albo panelu admina nigdy ich nie dostaj\u0105.<\/li>\n<li>Nieaktualny cache stron na serwerze origin, kt\u00f3ry dalej serwuje stary kod z http:\/\/.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">WordPress za reverse proxy dzia\u0142a stabilnie, gdy serwer origin zna prawdziwy schemat i host. Przeka\u017c nag\u0142\u00f3wki, odczytaj je w wp-config.php, ustaw na sztywno publiczny adres, wyczy\u015b\u0107 baz\u0119. To wszystko. Je\u015bli interesuj\u0105 Ci\u0119 pokrewne tematy konfiguracji, zajrzyj do <a href=\"https:\/\/jalvo.eu\/category\/seo\/\">poradnik\u00f3w o proxy i hostingu<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">FAQ<\/h2>\n\n\n<div id=\"rank-math-faq\" class=\"rank-math-block\">\n<div class=\"rank-math-list \">\n<div id=\"faq-question-1790304005243-0\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Dlaczego wp-admin ci\u0105gle przekierowuje po umieszczeniu WordPressa za proxy?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>u003cpu003eWordPress dostaje od proxy zwyk\u0142e HTTP i ca\u0142y czas wymusza HTTPS w panelu admina, wi\u0119c ka\u017cda odpowied\u017a wywo\u0142uje kolejne przekierowanie. Przeka\u017c X-Forwarded-Proto z NGINX i ustaw $_SERVER[&#8217;HTTPS&#8217;] w wp-config.php, gdy ten nag\u0142\u00f3wek ma warto\u015b\u0107 https. P\u0119tla znika, gdy tylko WordPress rozpozna \u017c\u0105danie jako bezpieczne.u003c\/pu003e<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1790304005243-1\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Czy serwer origin potrzebuje certyfikatu SSL?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>u003cpu003eDo samej poprawki nie, o ile po\u0142\u0105czenie mi\u0119dzy proxy a serwerem origin jest zaufane. Przekazany nag\u0142\u00f3wek ju\u017c m\u00f3wi WordPressowi, \u017ce odwiedzaj\u0105cy u\u017cy\u0142 HTTPS. W sieciach, kt\u00f3rych nie kontrolujesz, i tak szyfrowa\u0142bym ten odcinek. Chroni to loginy i ciasteczka w drodze do serwera origin.u003c\/pu003e<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1790304005243-2\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Dlaczego mapa strony nadal pokazuje IP serwera origin albo adresy http?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>u003cpu003eBo WP_HOME, WP_SITEURL albo kt\u00f3ra\u015b zapisana opcja wci\u0105\u017c ma star\u0105 warto\u015b\u0107. Zaktualizuj sta\u0142e, uruchom wp search-replace na ca\u0142ej bazie i wygeneruj map\u0119 strony od nowa we wtyczce SEO. Potem wyczy\u015b\u0107 cache stron, \u017ceby crawlery dosta\u0142y poprawion\u0105 wersj\u0119.u003c\/pu003e<\/p>\n\n<\/div>\n<\/div>\n<\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>WordPress za reverse proxy psuje si\u0119 z jednego prostego powodu: WordPress nie widzi protoko\u0142u ani hosta, z kt\u00f3rych naprawd\u0119 skorzysta\u0142 [&hellip;]<\/p>\n","protected":false},"author":25,"featured_media":2188,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[182],"tags":[342,247,32,347,355,356],"class_list":["post-2218","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-seo-pl","tag-https-x","tag-nginx-x","tag-odwrotne-proxy","tag-przekierowania","tag-ssl-x","tag-wordpress-x"],"acf":[],"_links":{"self":[{"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/posts\/2218","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=2218"}],"version-history":[{"count":1,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/posts\/2218\/revisions"}],"predecessor-version":[{"id":2228,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/posts\/2218\/revisions\/2228"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/media\/2188"}],"wp:attachment":[{"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/media?parent=2218"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/categories?post=2218"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/tags?post=2218"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}