{"id":13547,"date":"2026-09-02T13:14:21","date_gmt":"2026-09-02T11:14:21","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/toolbox\/redirect-chain-canonical-host-tracer\/"},"modified":"2026-09-02T13:14:21","modified_gmt":"2026-09-02T11:14:21","slug":"redirect-chain-canonical-host-tracer","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/redirect-chain-canonical-host-tracer\/","title":{"rendered":"Redirect Chain &#038; Canonical Host Tracer"},"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;\">A browser hides redirects; a search engine counts every one. This follows an address from this server, station by station, without trusting any client to merge the hops: status code, Location header, time per hop, and the server that answered. With the variants switch it then fetches http and https, with and without www, and reports whether all four end on one canonical address. The final page is read for meta refresh, JavaScript redirects and a canonical link that points elsewhere.<\/p>\n<div style=\"margin-bottom: 14px;\">\n        <label for=\"rd-url\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Address<\/label><br \/>\n        <input id=\"rd-url\" type=\"text\" value=\"http:\/\/example.com\/\" 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>    <label style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.85rem; display: block; margin-bottom: 14px;\"><br \/>\n        <input id=\"rd-varianten\" type=\"checkbox\" checked style=\"margin-right: 6px;\">Also check the four variants (http\/https, with and without www)<br \/>\n    <\/label><\/p>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.82rem; margin-bottom: 16px;\">Up to five redirect chains of at most ten hops each are fetched from this server, with a plain GET and no cookies. Requests to private networks, loopback and link-local addresses are refused at every hop. The query is protected by reCAPTCHA v3; the calling IP address and the target are stored for one hour to limit the rate.<\/p>\n<p>    <button id=\"rd-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;\">Trace the redirects<\/button><\/p>\n<div id=\"rd-ausgabe\" style=\"margin-top: 22px;\"><\/div>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.8rem; margin: 24px 0 0;\">Limit worth knowing: only HTTP redirects are followed. A meta refresh or a JavaScript redirect on the final page is reported, not followed. Redirects that depend on cookies, language headers or a mobile user agent may differ from what this server sees.<\/p>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"einleitung\":\"A browser hides redirects; a search engine counts every one. This follows an address from this server, station by station, without trusting any client to merge the hops: status code, Location header, time per hop, and the server that answered. With the variants switch it then fetches http and https, with and without www, and reports whether all four end on one canonical address. The final page is read for meta refresh, JavaScript redirects and a canonical link that points elsewhere.\",\"label_url\":\"Address\",\"label_varianten\":\"Also check the four variants (http\\\/https, with and without www)\",\"datenschutz\":\"Up to five redirect chains of at most ten hops each are fetched from this server, with a plain GET and no cookies. Requests to private networks, loopback and link-local addresses are refused at every hop. The query is protected by reCAPTCHA v3; the calling IP address and the target are stored for one hour to limit the rate.\",\"knopf\":\"Trace the redirects\",\"laeuft\":\"Following the chain...\",\"grenze\":\"Limit worth knowing: only HTTP redirects are followed. A meta refresh or a JavaScript redirect on the final page is reported, not followed. Redirects that depend on cookies, language headers or a mobile user agent may differ from what this server sees.\",\"h_uebersicht\":\"Overview\",\"zeile_eingabe\":\"Entered\",\"zeile_endziel\":\"Landed at\",\"zeile_endstatus\":\"Final status\",\"zeile_spruenge\":\"Redirects\",\"zeile_gesamt\":\"Total time of the chain\",\"zeile_limit\":\"Traces left this hour\",\"h_stationen\":\"Stations\",\"spalte_adresse\":\"Address\",\"spalte_status\":\"Status\",\"spalte_dauer\":\"Time\",\"spalte_kopf\":\"Headers\",\"h_varianten\":\"The four variants\",\"spalte_variante\":\"Variant\",\"spalte_erste\":\"First status\",\"spalte_spruenge\":\"Hops\",\"spalte_landet\":\"Lands at\",\"variante_kein_dns\":\"no DNS record\",\"variante_gesperrter_bereich\":\"resolves into a private network\",\"variante_abruf\":\"not reachable\",\"variante_zu_viele_spruenge\":\"loop or more than ten hops\",\"variante_fehler\":\"not reachable\",\"h_befunde\":\"Findings\",\"stufe_hoch\":\"High\",\"stufe_mittel\":\"Medium\",\"stufe_niedrig\":\"Low\",\"stufe_info\":\"Information\",\"stufe_gut\":\"In order\",\"keine_befunde\":\"Nothing to report.\",\"urteil_gut\":\"The chain is short and the variants agree.\",\"urteil_warnung\":\"Works, with something that costs time or ranking signals.\",\"urteil_kritisch\":\"At least one finding loses visitors or search engines on the way.\",\"fehler_kein_token\":\"The check could not be started because reCAPTCHA did not load.\",\"fehler_captcha\":\"reCAPTCHA classified the request as automated. Reloading the page normally helps.\",\"fehler_zu_viele\":\"The limit of {limit} traces per hour for this address has been reached.\",\"fehler_adresse\":\"That address cannot be used.\",\"fehler_zaehler\":\"The rate counter is unavailable, so nothing was fetched.\",\"fehler_pruefdienst\":\"The reCAPTCHA service could not be reached.\",\"fehler_aufbau\":\"The service is not configured correctly. The fault is on this side.\",\"fehler_eingabe\":\"The request could not be read.\",\"fehler_methode\":\"Wrong request method.\",\"fehler_netz\":\"The service could not be reached.\",\"fehler_antwort\":\"The answer could not be read.\",\"fehler_unbekannt\":\"Something went wrong that has no message of its own.\",\"grund_leer\":\"Nothing was entered.\",\"grund_zu_lang\":\"The address is too long.\",\"grund_unlesbar\":\"It does not parse as a web address.\",\"grund_schema\":\"Only http and https are fetched.\",\"grund_benutzerinfo\":\"Addresses with credentials in them are refused.\",\"grund_kein_punkt\":\"The host name needs at least one dot.\",\"grund_hostform\":\"The host name has an unusable form.\",\"grund_port\":\"Only ports 80, 443, 8080 and 8443 are fetched.\",\"grund_gesperrter_bereich\":\"That address points into a private or reserved network. Those are never fetched, not even through a redirect.\",\"grund_kein_dns\":\"The host name does not resolve.\",\"grund_zu_viele_spruenge\":\"Too many redirects.\",\"befund_abruf_fehlgeschlagen\":\"The chain broke at station {station}: {grund} || A hop could not be fetched: no DNS record, connection refused, timeout, or a redirect into a private network. Visitors get an error page at this point.\",\"befund_schleife\":\"Redirect loop or more than ten hops || The chain returns to {url} after {n} hops. Browsers stop with ERR_TOO_MANY_REDIRECTS; usually two rules contradict each other, for example a plugin forcing https while the proxy already terminated it.\",\"befund_keine_weiterleitung\":\"No redirect, answered {status} directly || The address is served as entered.\",\"befund_eine_weiterleitung\":\"One redirect || A single hop, which is what host and scheme canonicalisation needs.\",\"befund_kette_lang\":\"{n} redirects in a row || Each hop is a round trip before content arrives and a weaker signal for search engines. Collapse the chain so that the first station points to the final address directly.\",\"befund_kette_sehr_lang\":\"{n} redirects in a row || More than three hops. Every intermediate station is a rule that could point at the final address directly; the chain usually grew from migrations stacked on top of each other.\",\"befund_https_zu_http\":\"A hop goes from https back to http || The chain downgrades to an unencrypted address. Browsers warn, HSTS breaks it, and search engines treat the http version as the canonical one.\",\"befund_temporaer_statt_dauerhaft\":\"{n} temporary redirect(s) (302\\\/303\\\/307) in the chain || Temporary redirects tell search engines to keep the old address indexed. For host, scheme and moved content the permanent 301 or 308 is the right code; the list shows the stations.\",\"befund_hostwechsel\":\"The chain changes host || The address ends on a different host than entered, for example www added or a domain migration.\",\"befund_schraegstrich_station\":\"{n} hop(s) only add or remove a trailing slash || A separate station just for the slash is an extra round trip; the rule before it can point at the final form directly.\",\"befund_langsame_station\":\"{n} slow station(s) above one second || A redirect should take milliseconds; a slow one usually means the application boots just to send a Location header. The list shows the hops.\",\"befund_abfrage_verloren\":\"The query string was dropped ({query}) || The redirect target has no parameters. Tracking and campaign parameters are lost unless the rule passes them through (QSA on Apache, $args on nginx).\",\"befund_endstatus_ok\":\"Final page answers 200 || The chain ends on a page that exists.\",\"befund_endstatus_weg\":\"Final page answers {status} || The chain ends on a page that is gone. Every link that pointed at the entered address now leads visitors and crawlers into an error.\",\"befund_endstatus_server\":\"Final page answers {status} || The server fails at the end of the chain.\",\"befund_endstatus_fehler\":\"Final page answers {status} || The chain ends on a client error.\",\"befund_meta_refresh\":\"The final page contains a meta refresh to {url} after {sekunden} s || An HTML-level redirect that this trace does not follow. Search engines treat it as weak; a server-side 301 is cleaner.\",\"befund_js_weiterleitung\":\"The final page redirects with JavaScript || A location assignment in the first part of the page. Bots without JavaScript stay on this page.\",\"befund_canonical_abweichend\":\"The canonical link points elsewhere: {canonical} || The final page declares {canonical} as its canonical address rather than itself. Either the redirect should go there directly or the canonical is wrong.\",\"befund_canonical_passt\":\"Canonical link matches the final address || The page declares itself as canonical.\",\"befund_hsts_vorhanden\":\"HSTS is set on the final page || Browsers that have seen it skip the http hop on later visits.\",\"befund_hsts_fehlt\":\"No HSTS on the final https page || Every later visit typed without https still starts with the unencrypted hop.\",\"befund_kanonisch_einheitlich\":\"All {n} variants land on {ziel} || http and https, with and without www, end on the same address. That is the canonical setup search engines want.\",\"befund_kanonisch_uneinheitlich\":\"The variants land on different addresses || The four entry points do not converge; the list shows where each ends. Duplicate content and split ranking signals follow. One host and one scheme should be the target of every other variant.\",\"befund_http_ohne_weiterleitung\":\"{variante} answers 200 without redirecting to https || The unencrypted variant serves the page itself instead of forwarding. Search engines may index it, and visitors typing the bare domain stay on http.\",\"befund_variante_unerreichbar\":\"Variant(s) not reachable || A variant has no DNS record or does not answer. Harmless when nobody links to it; the list shows which.\",\"befund_variante_schleife\":\"Variant(s) with a loop or more than ten hops || A variant never settles.\"};<\/p>\n<p>    var ENDPUNKT = '\/lw-redirects.php';\n    var SITEKEY = '6LcrPkEtAAAAAPo1QCOf-IIM2fCL0UfdJz4y2iSY';\n    var STUFEN = ['hoch', 'mittel', 'niedrig', 'info', 'gut'];\n    var VARIANTEN = ['https_www', 'https_apex', 'http_www', 'http_apex'];<\/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_]+)\\}\/g, function (m, k) {\n            if (daten && daten[k] !== undefined && daten[k] !== null) { return Array.isArray(daten[k]) ? daten[k].join(', ') : String(daten[k]); }\n            return m;\n        });\n    }<\/p>\n<p>    function bewerten(antwort) {\n        var a = antwort || {};\n        if (a.fehler) { return { fehler: a.fehler, grund: a.grund || null, limit: zahl(a.limit) }; }\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 && 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 stationen = liste(a.stationen).map(function (s) {\n            return { url: s.url || '', status: zahl(s.status), ort: s.ort || null, dauer: zahl(s.dauer_ms), kopf: (s.kopf && typeof s.kopf === 'object') ? s.kopf : {}, ip: s.ip || '' };\n        });\n        var varianten = [];\n        VARIANTEN.forEach(function (k) {\n            var v = a.varianten && a.varianten[k];\n            if (!v) { return; }\n            varianten.push({ key: k, eingabe: v.eingabe || '', endziel: v.endziel || null, endstatus: zahl(v.endstatus), spruenge: zahl(v.spruenge) || 0, fehler: v.fehler || null, statusErste: zahl(v.status_erste) });\n        });\n        return {\n            fehler: null, eingabe: a.eingabe || '', endziel: a.endziel || null, endstatus: zahl(a.endstatus), spruenge: zahl(a.spruenge) || 0, gesamt: zahl(a.gesamt_ms),\n            urteil: (a.urteil === 'gut' || a.urteil === 'warnung' || a.urteil === 'kritisch') ? a.urteil : 'kritisch',\n            stationen: stationen, varianten: varianten, befunde: befunde, gruppen: gruppen, dauer: zahl(a.dauer_ms), limitRest: zahl(a.limit_rest)\n        };\n    }<\/p>\n<p>    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: 'redirects' }).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, varianten) {\n        return tokenHolen().then(function (token) {\n            return fetch(ENDPUNKT, { method: 'POST', headers: { 'Content-Type': 'application\/json' }, body: JSON.stringify({ url: url, token: token || '', varianten: !!varianten }) })\n                .then(function (r) { return r.json().then(function (j) { return j; }, function () { return { fehler: 'antwort' }; }); }, function () { return { fehler: 'netz' }; });\n        });\n    }<\/p>\n<p>    window.LW_TEST = window.LW_TEST || {};\n    window.LW_TEST.RD = { bewerten: bewerten, darstellen: null, text: text, ENDPUNKT: ENDPUNKT, STUFEN: STUFEN, VARIANTEN: VARIANTEN, T: T };<\/p>\n<p>    var btn = document.getElementById('rd-btn');\n    var out = document.getElementById('rd-ausgabe');\n    if (!btn || !out) { return; }<\/p>\n<p>    function el(tag, stil, txt) { var e = document.createElement(tag); if (stil) { e.setAttribute('style', stil); } if (txt !== undefined && 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 statusStil(s) { if (s === null) { return GRAU; } if (s === 200) { return GUT; } if (s === 301 || s === 308) { return ''; } if (s >= 300 && s < 400) { return WARN; } return ROT; }\n    function kopfZeile(g, sp) { sp.forEach(function (s) { g.appendChild(el('div', ZELLE + ' font-weight: 700; color: var(--text-primary, #e8e8ee); white-space: nowrap;', s)); }); }\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_uebersicht));\n        var g = gitter('auto auto');\n        paar(g, T.zeile_eingabe, b.eingabe);\n        paar(g, T.zeile_endziel, b.endziel || '-');\n        paar(g, T.zeile_endstatus, b.endstatus === null ? '-' : String(b.endstatus), statusStil(b.endstatus));\n        paar(g, T.zeile_spruenge, String(b.spruenge), b.spruenge === 0 ? GUT : (b.spruenge === 1 ? '' : WARN));\n        if (b.gesamt !== null) { paar(g, T.zeile_gesamt, b.gesamt + ' ms', b.gesamt > 1500 ? WARN : GRAU); }\n        if (b.limitRest !== null) { paar(g, T.zeile_limit, String(b.limitRest), GRAU); }\n        ziel.appendChild(g);<\/p>\n<p>        if (b.stationen.length) {\n            ziel.appendChild(el('div', UEBERSCHRIFT, T.h_stationen));\n            var wrap = el('div', 'overflow-x: auto;');\n            var gs = gitter('auto minmax(200px, 3fr) auto auto minmax(120px, 2fr)');\n            kopfZeile(gs, ['#', T.spalte_adresse, T.spalte_status, T.spalte_dauer, T.spalte_kopf]);\n            b.stationen.forEach(function (s, i) {\n                gs.appendChild(el('div', ZELLE, String(i + 1)));\n                var z = el('div', ZELLE_WERT, s.url);\n                if (s.ort) { z.appendChild(el('div', ZELLE + GRAU + ' padding: 2px 0 0;', '\u2192 ' + s.ort)); }\n                gs.appendChild(z);\n                gs.appendChild(el('div', ZELLE_WERT + statusStil(s.status), s.status === null ? '-' : String(s.status)));\n                gs.appendChild(el('div', ZELLE_WERT + (s.dauer !== null && s.dauer > 1000 ? WARN : GRAU), s.dauer === null ? '-' : s.dauer + ' ms'));\n                var k = [];\n                ['server', 'cache-control', 'x-redirect-by', 'strict-transport-security'].forEach(function (n) { if (s.kopf[n]) { k.push(n + ': ' + s.kopf[n]); } });\n                gs.appendChild(el('div', ZELLE + GRAU + ' font-size: 0.78rem;', k.join(' \u00b7 ')));\n            });\n            wrap.appendChild(gs);\n            ziel.appendChild(wrap);\n        }<\/p>\n<p>        if (b.varianten.length) {\n            ziel.appendChild(el('div', UEBERSCHRIFT, T.h_varianten));\n            var gv = gitter('minmax(160px, 2fr) auto auto minmax(160px, 2fr)');\n            kopfZeile(gv, [T.spalte_variante, T.spalte_erste, T.spalte_spruenge, T.spalte_landet]);\n            b.varianten.forEach(function (v) {\n                gv.appendChild(el('div', ZELLE_WERT, v.eingabe));\n                if (v.fehler) {\n                    gv.appendChild(el('div', ZELLE + GRAU, '-'));\n                    gv.appendChild(el('div', ZELLE + GRAU, '-'));\n                    gv.appendChild(el('div', ZELLE + WARN, T['variante_' + v.fehler] || T.variante_fehler));\n                } else {\n                    gv.appendChild(el('div', ZELLE_WERT + statusStil(v.statusErste), v.statusErste === null ? '-' : String(v.statusErste)));\n                    gv.appendChild(el('div', ZELLE_WERT, String(v.spruenge)));\n                    gv.appendChild(el('div', ZELLE_WERT + statusStil(v.endstatus), (v.endziel || '-') + (v.endstatus !== null ? ' (' + v.endstatus + ')' : '')));\n                }\n            });\n            ziel.appendChild(gv);\n        }<\/p>\n<p>        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                if (Array.isArray(f.daten.liste) && f.daten.liste.length) {\n                    var l = el('ul', 'margin: 8px 0 0 18px; padding: 0; color: var(--text-secondary, #a0a0b0); font-size: 0.8rem; font-family: monospace; word-break: break-all;');\n                    f.daten.liste.forEach(function (x) { l.appendChild(el('li', '', String(x))); });\n                    k.appendChild(l);\n                }\n                ziel.appendChild(k);\n            });\n        });\n        if (!irgendwas) { ziel.appendChild(el('p', ZELLE + ' margin: 0;', T.keine_befunde)); }\n    }\n    window.LW_TEST.RD.darstellen = darstellen;<\/p>\n<p>    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        var mitV = document.getElementById('rd-varianten');\n        abfragen(wert('rd-url'), mitV ? mitV.checked : true).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>Follows an address hop by hop and shows every station with status code, Location and timing, then tries the four variants http\/https with and without www to see whether they all land on the same page. Flags loops, chains, 302 where 301 belongs and https to http downgrades.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":38,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[91144,91094,91315],"class_list":["post-13547","page","type-page","status-publish","hentry","tag-devops","tag-seo","tag-web-performance"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Redirect Chain &amp; Canonical Host Tracer - 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\/en\/toolbox\/redirect-chain-canonical-host-tracer\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Redirect Chain &amp; Canonical Host Tracer - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Follows an address hop by hop and shows every station with status code, Location and timing, then tries the four variants http\/https with and without www to see whether they all land on the same page. Flags loops, chains, 302 where 301 belongs and https to http downgrades.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/redirect-chain-canonical-host-tracer\/\" \/>\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\\\/en\\\/toolbox\\\/redirect-chain-canonical-host-tracer\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/redirect-chain-canonical-host-tracer\\\/\",\"name\":\"Redirect Chain & Canonical Host Tracer - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-09-02T11:14:21+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/redirect-chain-canonical-host-tracer\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/redirect-chain-canonical-host-tracer\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/redirect-chain-canonical-host-tracer\\\/#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\\\/en\\\/toolbox\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Redirect Chain &#038; Canonical Host Tracer\"}]},{\"@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":"Redirect Chain & Canonical Host Tracer - 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\/en\/toolbox\/redirect-chain-canonical-host-tracer\/","og_locale":"en_US","og_type":"article","og_title":"Redirect Chain & Canonical Host Tracer - Lukas Wojcik - Blog","og_description":"Follows an address hop by hop and shows every station with status code, Location and timing, then tries the four variants http\/https with and without www to see whether they all land on the same page. Flags loops, chains, 302 where 301 belongs and https to http downgrades.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/redirect-chain-canonical-host-tracer\/","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\/en\/toolbox\/redirect-chain-canonical-host-tracer\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/redirect-chain-canonical-host-tracer\/","name":"Redirect Chain & Canonical Host Tracer - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-09-02T11:14:21+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/redirect-chain-canonical-host-tracer\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/redirect-chain-canonical-host-tracer\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/redirect-chain-canonical-host-tracer\/#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\/en\/toolbox\/"},{"@type":"ListItem","position":3,"name":"Redirect Chain &#038; Canonical Host Tracer"}]},{"@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\/13547","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=13547"}],"version-history":[{"count":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/13547\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/38"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=13547"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=13547"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}