{"id":13548,"date":"2026-09-02T13:14:23","date_gmt":"2026-09-02T11:14:23","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/werkzeuge\/redirect-chain-canonical-host-tracer\/"},"modified":"2026-09-02T13:14:23","modified_gmt":"2026-09-02T11:14:23","slug":"redirect-chain-canonical-host-tracer","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/redirect-chain-canonical-host-tracer\/","title":{"rendered":"Redirect-Ketten- und 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;\">Ein Browser verbirgt Weiterleitungen; eine Suchmaschine z\u00e4hlt jede einzelne. Dieses Werkzeug folgt einer Adresse von diesem Server aus, Station f\u00fcr Station, ohne einem Client das Zusammenfassen zu \u00fcberlassen: Statuscode, Location-Kopfzeile, Dauer je Station und der Server, der geantwortet hat. Mit dem Varianten-Schalter holt es zus\u00e4tzlich http und https, mit und ohne www, und meldet, ob alle vier auf einer kanonischen Adresse enden. Die Endseite wird auf Meta-Refresh, JavaScript-Weiterleitung und einen Canonical-Link gelesen, der woandershin zeigt.<\/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;\">Adresse<\/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;\">Auch die vier Varianten pr\u00fcfen (http\/https, mit und ohne www)<br \/>\n    <\/label><\/p>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.82rem; margin-bottom: 16px;\">Bis zu f\u00fcnf Weiterleitungsketten mit je h\u00f6chstens zehn Stationen werden von diesem Server abgerufen, als einfaches GET ohne Cookies. Abrufe in private Netze, auf Loopback- und Link-local-Adressen werden an jeder Station verweigert. Die Abfrage ist durch reCAPTCHA v3 gesch\u00fctzt; die aufrufende IP-Adresse und das Ziel werden eine Stunde gespeichert, um die Rate zu begrenzen.<\/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;\">Weiterleitungen verfolgen<\/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;\">Grenze, die dazugeh\u00f6rt: Verfolgt werden nur HTTP-Weiterleitungen. Ein Meta-Refresh oder eine JavaScript-Weiterleitung auf der Endseite wird gemeldet, nicht verfolgt. Weiterleitungen, die von Cookies, Sprachkopfzeilen oder einem mobilen User-Agent abh\u00e4ngen, k\u00f6nnen von dem abweichen, was dieser Server sieht.<\/p>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"einleitung\":\"Ein Browser verbirgt Weiterleitungen; eine Suchmaschine z\u00e4hlt jede einzelne. Dieses Werkzeug folgt einer Adresse von diesem Server aus, Station f\u00fcr Station, ohne einem Client das Zusammenfassen zu \u00fcberlassen: Statuscode, Location-Kopfzeile, Dauer je Station und der Server, der geantwortet hat. Mit dem Varianten-Schalter holt es zus\u00e4tzlich http und https, mit und ohne www, und meldet, ob alle vier auf einer kanonischen Adresse enden. Die Endseite wird auf Meta-Refresh, JavaScript-Weiterleitung und einen Canonical-Link gelesen, der woandershin zeigt.\",\"label_url\":\"Adresse\",\"label_varianten\":\"Auch die vier Varianten pr\u00fcfen (http\\\/https, mit und ohne www)\",\"datenschutz\":\"Bis zu f\u00fcnf Weiterleitungsketten mit je h\u00f6chstens zehn Stationen werden von diesem Server abgerufen, als einfaches GET ohne Cookies. Abrufe in private Netze, auf Loopback- und Link-local-Adressen werden an jeder Station verweigert. Die Abfrage ist durch reCAPTCHA v3 gesch\u00fctzt; die aufrufende IP-Adresse und das Ziel werden eine Stunde gespeichert, um die Rate zu begrenzen.\",\"knopf\":\"Weiterleitungen verfolgen\",\"laeuft\":\"Kette wird verfolgt...\",\"grenze\":\"Grenze, die dazugeh\u00f6rt: Verfolgt werden nur HTTP-Weiterleitungen. Ein Meta-Refresh oder eine JavaScript-Weiterleitung auf der Endseite wird gemeldet, nicht verfolgt. Weiterleitungen, die von Cookies, Sprachkopfzeilen oder einem mobilen User-Agent abh\u00e4ngen, k\u00f6nnen von dem abweichen, was dieser Server sieht.\",\"h_uebersicht\":\"\u00dcbersicht\",\"zeile_eingabe\":\"Eingegeben\",\"zeile_endziel\":\"Gelandet auf\",\"zeile_endstatus\":\"Endstatus\",\"zeile_spruenge\":\"Weiterleitungen\",\"zeile_gesamt\":\"Gesamtdauer der Kette\",\"zeile_limit\":\"L\u00e4ufe in dieser Stunde noch\",\"h_stationen\":\"Stationen\",\"spalte_adresse\":\"Adresse\",\"spalte_status\":\"Status\",\"spalte_dauer\":\"Dauer\",\"spalte_kopf\":\"Kopfzeilen\",\"h_varianten\":\"Die vier Varianten\",\"spalte_variante\":\"Variante\",\"spalte_erste\":\"Erster Status\",\"spalte_spruenge\":\"Spr\u00fcnge\",\"spalte_landet\":\"Landet auf\",\"variante_kein_dns\":\"kein DNS-Eintrag\",\"variante_gesperrter_bereich\":\"l\u00f6st in ein privates Netz auf\",\"variante_abruf\":\"nicht erreichbar\",\"variante_zu_viele_spruenge\":\"Schleife oder mehr als zehn Spr\u00fcnge\",\"variante_fehler\":\"nicht erreichbar\",\"h_befunde\":\"Befunde\",\"stufe_hoch\":\"Hoch\",\"stufe_mittel\":\"Mittel\",\"stufe_niedrig\":\"Niedrig\",\"stufe_info\":\"Hinweis\",\"stufe_gut\":\"In Ordnung\",\"keine_befunde\":\"Nichts zu berichten.\",\"urteil_gut\":\"Die Kette ist kurz, und die Varianten stimmen \u00fcberein.\",\"urteil_warnung\":\"Funktioniert, mit etwas, das Zeit oder Rankingsignale kostet.\",\"urteil_kritisch\":\"Mindestens ein Befund verliert Besucher oder Suchmaschinen unterwegs.\",\"fehler_kein_token\":\"Die Pr\u00fcfung konnte nicht starten, weil reCAPTCHA nicht geladen wurde.\",\"fehler_captcha\":\"reCAPTCHA hat die Anfrage als automatisiert eingestuft. Ein Neuladen der Seite hilft in der Regel.\",\"fehler_zu_viele\":\"Die Grenze von {limit} L\u00e4ufen je Stunde f\u00fcr diese Adresse ist erreicht.\",\"fehler_adresse\":\"Diese Adresse l\u00e4sst sich nicht verwenden.\",\"fehler_zaehler\":\"Der Z\u00e4hler ist nicht erreichbar, deshalb wurde nichts abgerufen.\",\"fehler_pruefdienst\":\"Der reCAPTCHA-Dienst war nicht erreichbar.\",\"fehler_aufbau\":\"Der Dienst ist nicht richtig eingerichtet. Der Fehler liegt auf dieser Seite.\",\"fehler_eingabe\":\"Die Anfrage war nicht lesbar.\",\"fehler_methode\":\"Falsche Anfragemethode.\",\"fehler_netz\":\"Der Dienst war nicht erreichbar.\",\"fehler_antwort\":\"Die Antwort war nicht lesbar.\",\"fehler_unbekannt\":\"Etwas ging schief, wof\u00fcr es keine eigene Meldung gibt.\",\"grund_leer\":\"Es wurde nichts eingegeben.\",\"grund_zu_lang\":\"Die Adresse ist zu lang.\",\"grund_unlesbar\":\"Das ist keine lesbare Webadresse.\",\"grund_schema\":\"Abgerufen werden nur http und https.\",\"grund_benutzerinfo\":\"Adressen mit Zugangsdaten werden abgelehnt.\",\"grund_kein_punkt\":\"Der Hostname braucht mindestens einen Punkt.\",\"grund_hostform\":\"Der Hostname hat eine unbrauchbare Form.\",\"grund_port\":\"Abgerufen werden nur die Ports 80, 443, 8080 und 8443.\",\"grund_gesperrter_bereich\":\"Diese Adresse zeigt in ein privates oder reserviertes Netz. Solche werden nie abgerufen, auch nicht \u00fcber eine Weiterleitung.\",\"grund_kein_dns\":\"Der Hostname l\u00e4sst sich nicht aufl\u00f6sen.\",\"grund_zu_viele_spruenge\":\"Zu viele Weiterleitungen.\",\"befund_abruf_fehlgeschlagen\":\"Die Kette brach an Station {station} ab: {grund} || Eine Station lie\u00df sich nicht abrufen: kein DNS-Eintrag, Verbindung verweigert, Zeit\u00fcberschreitung oder eine Weiterleitung in ein privates Netz. Besucher sehen an dieser Stelle eine Fehlerseite.\",\"befund_schleife\":\"Weiterleitungsschleife oder mehr als zehn Spr\u00fcnge || Die Kette kehrt nach {n} Spr\u00fcngen zu {url} zur\u00fcck. Browser brechen mit ERR_TOO_MANY_REDIRECTS ab; meist widersprechen sich zwei Regeln, etwa ein Plugin, das https erzwingt, w\u00e4hrend der Proxy es schon beendet hat.\",\"befund_keine_weiterleitung\":\"Keine Weiterleitung, direkt mit {status} beantwortet || Die Adresse wird so ausgeliefert, wie sie eingegeben wurde.\",\"befund_eine_weiterleitung\":\"Eine Weiterleitung || Ein einziger Sprung, genau das, was die Kanonisierung von Host und Schema braucht.\",\"befund_kette_lang\":\"{n} Weiterleitungen hintereinander || Jeder Sprung ist eine Runde, bevor Inhalt kommt, und ein schw\u00e4cheres Signal f\u00fcr Suchmaschinen. Die Kette so zusammenziehen, dass die erste Station direkt auf die Endadresse zeigt.\",\"befund_kette_sehr_lang\":\"{n} Weiterleitungen hintereinander || Mehr als drei Spr\u00fcnge. Jede Zwischenstation ist eine Regel, die direkt auf die Endadresse zeigen k\u00f6nnte; solche Ketten entstehen meist aus \u00fcbereinandergestapelten Umz\u00fcgen.\",\"befund_https_zu_http\":\"Ein Sprung f\u00fchrt von https zur\u00fcck auf http || Die Kette steigt auf eine unverschl\u00fcsselte Adresse ab. Browser warnen, HSTS bricht es, und Suchmaschinen halten die http-Fassung f\u00fcr die kanonische.\",\"befund_temporaer_statt_dauerhaft\":\"{n} tempor\u00e4re Weiterleitung(en) (302\\\/303\\\/307) in der Kette || Tempor\u00e4re Weiterleitungen sagen Suchmaschinen, die alte Adresse im Index zu behalten. F\u00fcr Host, Schema und umgezogene Inhalte ist der dauerhafte Code 301 oder 308 richtig; die Liste zeigt die Stationen.\",\"befund_hostwechsel\":\"Die Kette wechselt den Host || Die Adresse endet auf einem anderen Host als eingegeben, etwa mit www oder nach einem Domainumzug.\",\"befund_schraegstrich_station\":\"{n} Sprung\\\/Spr\u00fcnge nur f\u00fcr den Schr\u00e4gstrich am Ende || Eine eigene Station allein f\u00fcr den Schr\u00e4gstrich ist eine zus\u00e4tzliche Runde; die Regel davor kann direkt auf die Endform zeigen.\",\"befund_langsame_station\":\"{n} langsame Station(en) \u00fcber einer Sekunde || Eine Weiterleitung sollte Millisekunden dauern; eine langsame hei\u00dft meist, dass die Anwendung nur startet, um eine Location-Kopfzeile zu senden. Die Liste zeigt die Stationen.\",\"befund_abfrage_verloren\":\"Der Abfrageteil ging verloren ({query}) || Das Ziel der Weiterleitung hat keine Parameter. Tracking- und Kampagnenparameter gehen verloren, sofern die Regel sie nicht durchreicht (QSA bei Apache, $args bei nginx).\",\"befund_endstatus_ok\":\"Endseite antwortet mit 200 || Die Kette endet auf einer Seite, die existiert.\",\"befund_endstatus_weg\":\"Endseite antwortet mit {status} || Die Kette endet auf einer Seite, die es nicht mehr gibt. Jeder Link auf die eingegebene Adresse f\u00fchrt Besucher und Crawler jetzt in einen Fehler.\",\"befund_endstatus_server\":\"Endseite antwortet mit {status} || Der Server scheitert am Ende der Kette.\",\"befund_endstatus_fehler\":\"Endseite antwortet mit {status} || Die Kette endet auf einem Clientfehler.\",\"befund_meta_refresh\":\"Die Endseite enth\u00e4lt einen Meta-Refresh auf {url} nach {sekunden} s || Eine Weiterleitung auf HTML-Ebene, die dieser Lauf nicht verfolgt. Suchmaschinen werten sie schwach; ein serverseitiger 301 ist sauberer.\",\"befund_js_weiterleitung\":\"Die Endseite leitet per JavaScript weiter || Eine location-Zuweisung im vorderen Teil der Seite. Bots ohne JavaScript bleiben auf dieser Seite.\",\"befund_canonical_abweichend\":\"Der Canonical-Link zeigt woandershin: {canonical} || Die Endseite erkl\u00e4rt {canonical} statt sich selbst zur kanonischen Adresse. Entweder sollte die Weiterleitung direkt dorthin f\u00fchren, oder der Canonical ist falsch.\",\"befund_canonical_passt\":\"Canonical-Link passt zur Endadresse || Die Seite erkl\u00e4rt sich selbst zur kanonischen.\",\"befund_hsts_vorhanden\":\"HSTS ist auf der Endseite gesetzt || Browser, die es gesehen haben, \u00fcberspringen den http-Sprung bei sp\u00e4teren Besuchen.\",\"befund_hsts_fehlt\":\"Kein HSTS auf der https-Endseite || Jeder sp\u00e4tere Besuch, der ohne https eingetippt wird, beginnt weiter mit dem unverschl\u00fcsselten Sprung.\",\"befund_kanonisch_einheitlich\":\"Alle {n} Varianten landen auf {ziel} || http und https, mit und ohne www, enden auf derselben Adresse. Das ist der kanonische Aufbau, den Suchmaschinen wollen.\",\"befund_kanonisch_uneinheitlich\":\"Die Varianten landen auf verschiedenen Adressen || Die vier Einstiege laufen nicht zusammen; die Liste zeigt, wo jeder endet. Die Folge sind doppelte Inhalte und geteilte Rankingsignale. Ein Host und ein Schema sollten das Ziel jeder anderen Variante sein.\",\"befund_http_ohne_weiterleitung\":\"{variante} antwortet mit 200 statt auf https zu leiten || Die unverschl\u00fcsselte Variante liefert die Seite selbst aus, statt weiterzuleiten. Suchmaschinen k\u00f6nnen sie indexieren, und wer die nackte Domain tippt, bleibt auf http.\",\"befund_variante_unerreichbar\":\"Variante(n) nicht erreichbar || Eine Variante hat keinen DNS-Eintrag oder antwortet nicht. Harmlos, solange niemand darauf verlinkt; die Liste zeigt welche.\",\"befund_variante_schleife\":\"Variante(n) mit Schleife oder mehr als zehn Spr\u00fcngen || Eine Variante kommt nie zur Ruhe.\"};<\/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>Folgt einer Adresse Station f\u00fcr Station und zeigt jede mit Statuscode, Location und Dauer, danach die vier Varianten http\/https mit und ohne www und ob alle auf derselben Seite landen. Meldet Schleifen, Ketten, 302 statt 301 und Abstiege von https auf http.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":9283,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[92214,92289,92292],"class_list":["post-13548","page","type-page","status-publish","hentry","tag-devops-de","tag-seo-de","tag-web-performance-de"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Redirect-Ketten- und 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\/de\/werkzeuge\/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-Ketten- und Canonical-Host-Tracer - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Folgt einer Adresse Station f\u00fcr Station und zeigt jede mit Statuscode, Location und Dauer, danach die vier Varianten http\/https mit und ohne www und ob alle auf derselben Seite landen. Meldet Schleifen, Ketten, 302 statt 301 und Abstiege von https auf http.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/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\\\/de\\\/werkzeuge\\\/redirect-chain-canonical-host-tracer\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/redirect-chain-canonical-host-tracer\\\/\",\"name\":\"Redirect-Ketten- und Canonical-Host-Tracer - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-09-02T11:14:23+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/redirect-chain-canonical-host-tracer\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/redirect-chain-canonical-host-tracer\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/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\\\/toolbox-2\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Redirect-Ketten- und 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-Ketten- und 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\/de\/werkzeuge\/redirect-chain-canonical-host-tracer\/","og_locale":"en_US","og_type":"article","og_title":"Redirect-Ketten- und Canonical-Host-Tracer - Lukas Wojcik - Blog","og_description":"Folgt einer Adresse Station f\u00fcr Station und zeigt jede mit Statuscode, Location und Dauer, danach die vier Varianten http\/https mit und ohne www und ob alle auf derselben Seite landen. Meldet Schleifen, Ketten, 302 statt 301 und Abstiege von https auf http.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/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\/de\/werkzeuge\/redirect-chain-canonical-host-tracer\/","url":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/redirect-chain-canonical-host-tracer\/","name":"Redirect-Ketten- und Canonical-Host-Tracer - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-09-02T11:14:23+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/redirect-chain-canonical-host-tracer\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/redirect-chain-canonical-host-tracer\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/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\/toolbox-2\/"},{"@type":"ListItem","position":3,"name":"Redirect-Ketten- und 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\/13548","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=13548"}],"version-history":[{"count":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/13548\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/9283"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=13548"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=13548"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}