{"id":15701,"date":"2026-09-06T00:47:38","date_gmt":"2026-09-05T22:47:38","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/toolbox\/soft-404-error-page-checker\/"},"modified":"2026-09-06T00:47:38","modified_gmt":"2026-09-05T22:47:38","slug":"soft-404-error-page-checker","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/soft-404-error-page-checker\/","title":{"rendered":"Soft 404 &#038; Error Page Checker: what a site answers for an address that does not exist"},"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;\">Every site answers something for an address that does not exist, and what it answers decides whether anyone ever notices a broken link. A 404 is a clear no. A 200 with a friendly page is a yes, and search engines treat it as a page worth indexing. This check requests three addresses that cannot exist and compares each answer with a page that does.<\/p>\n<div style=\"margin-bottom: 14px;\">\n        <label for=\"fehl-url\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Address of a page that exists<\/label><br \/>\n        <input id=\"fehl-url\" type=\"text\" value=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; box-sizing: border-box; font-family: monospace;\">\n    <\/div>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.82rem; margin-bottom: 16px;\">From this server: one request for the given page and three for random addresses on the same host, each capped at 256 KB. No cookies are sent, no scripts are executed, nothing is stored beyond the rate counter.<\/p>\n<p>    <button id=\"fehl-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;\">Check error pages<\/button><\/p>\n<div id=\"fehl-ausgabe\" style=\"margin-top: 22px;\"><\/div>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.8rem; margin: 24px 0 0;\">Limits worth knowing: the three test addresses are random, so a cache cannot answer them from an earlier visit. Redirects are recorded but not followed \u2014 what matters is the first answer, because that is what a crawler records.<\/p>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"einleitung\":\"Every site answers something for an address that does not exist, and what it answers decides whether anyone ever notices a broken link. A 404 is a clear no. A 200 with a friendly page is a yes, and search engines treat it as a page worth indexing. This check requests three addresses that cannot exist and compares each answer with a page that does.\",\"label_url\":\"Address of a page that exists\",\"datenschutz\":\"From this server: one request for the given page and three for random addresses on the same host, each capped at 256 KB. No cookies are sent, no scripts are executed, nothing is stored beyond the rate counter.\",\"knopf\":\"Check error pages\",\"laeuft\":\"Requesting addresses that do not exist...\",\"grenze\":\"Limits worth knowing: the three test addresses are random, so a cache cannot answer them from an earlier visit. Redirects are recorded but not followed \u2014 what matters is the first answer, because that is what a crawler records.\",\"h_proben\":\"Addresses that do not exist\",\"tabelle_hinweis\":\"Similarity compares the words of the answer with the words of the page that exists. A high value on a 404 means the server sends the right status but a page that looks like content.\",\"h_befunde\":\"Findings\",\"sp_art\":\"Form\",\"sp_adresse\":\"Address\",\"sp_status\":\"Status\",\"sp_ziel\":\"Redirect to\",\"sp_groesse\":\"Size\",\"sp_aehnlich\":\"Similarity\",\"sp_noindex\":\"noindex\",\"art_ohne_endung\":\"no extension\",\"art_mit_endung\":\".html\",\"art_verzeichnis\":\"directory\",\"zeile_vergleich\":\"Compared against\",\"zeile_vergleich_status\":\"Its status\",\"zeile_dauer\":\"Took\",\"zeile_limit\":\"Checks left this hour\",\"wert_fehlt\":\"none\",\"wert_ja\":\"yes\",\"wert_nein\":\"no\",\"stufe_hoch\":\"High\",\"stufe_mittel\":\"Medium\",\"stufe_niedrig\":\"Low\",\"stufe_info\":\"Information\",\"stufe_gut\":\"In order\",\"keine_befunde\":\"Nothing to report.\",\"urteil_gut\":\"Addresses that do not exist are answered clearly.\",\"urteil_warnung\":\"The answer is understandable but not what a crawler expects.\",\"urteil_kritisch\":\"A missing page answers as if it existed, or the server fails on it.\",\"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} checks per hour for this address has been reached.\",\"fehler_adresse\":\"That address cannot be used.\",\"fehler_abruf\":\"The page could not be fetched.\",\"fehler_zaehler\":\"The rate counter is unavailable, so nothing was checked.\",\"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 input is too long.\",\"grund_unlesbar\":\"It does not parse as an address.\",\"grund_schema\":\"Only http and https addresses are checked.\",\"grund_benutzerinfo\":\"Inputs with credentials in them are refused.\",\"grund_kein_punkt\":\"The host name needs at least one dot.\",\"grund_hostform\":\"A host name is expected, not an IP address.\",\"grund_port\":\"Only the ports 80, 443, 8080 and 8443 are checked.\",\"grund_gesperrter_bereich\":\"That host resolves into a private or reserved network. Those are never fetched.\",\"grund_kein_dns\":\"The host name does not resolve.\",\"grund_abruf\":\"The address did not answer.\",\"grund_zu_viele_spruenge\":\"The address redirects too often.\",\"befund_vergleichsseite_status\":\"The page given for comparison answered with status {status} || The three test addresses were still requested, but the similarity figures compare against a page that is itself an error or a redirect.\",\"befund_probe_unerreichbar\":\"The {art} form could not be requested || Reason: {grund}. That one form stays unknown; the others still count.\",\"befund_soft_404\":\"The {art} form answers with 200 || {url}, {aehnlich} % of its words match the page that exists. A missing address answering 200 is a soft 404: search engines may index it, and every link checker reports the link as working.\",\"befund_richtig_404\":\"The {art} form answers with 404 || That is the clear answer: the address does not exist, and nothing is left to interpret.\",\"befund_gone\":\"The {art} form answers with 410 || Gone is a stronger statement than 404: the address existed and will not come back. Search engines remove such addresses faster.\",\"befund_umleitung_startseite\":\"The {art} form redirects to the start page || Status {status}. That turns every mistyped address into a visit to the front page, and a crawler records a redirect rather than a missing page. A 404 states the situation; a redirect hides it.\",\"befund_umleitung\":\"The {art} form redirects || Status {status} to {ziel}. A redirect for an address that never existed sends the crawler somewhere else instead of answering the question.\",\"befund_serverfehler\":\"The {art} form answers with status {status} || A missing address should not make the server fail. Crawlers slow down for 5xx answers, which affects the whole site, not just this address.\",\"befund_gesperrt\":\"The {art} form answers with status {status} || Refused rather than reported missing. That is defensible, but it says nothing about whether the address exists.\",\"befund_unerwarteter_status\":\"The {art} form answers with status {status} || Neither a clear no nor a redirect. Crawlers interpret unusual codes conservatively and may come back.\",\"befund_fehlerseite_wie_echte\":\"The error page for the {art} form resembles the real page ({prozent} %) || The status is right, so machines see the difference. Readers may not: the page looks like content rather than a message.\",\"befund_fehlerseite_schwer\":\"The error page for the {art} form weighs {kb} KB || A message that says nothing exists here costs as much as a full page. Crawlers request it often, especially after a restructuring.\",\"befund_fehlerseite_leer\":\"The error page for the {art} form is only {bytes} bytes || Cheap to deliver, but it says nothing to a visitor who took a wrong link. A short line with a way back is enough.\",\"befund_fehlerseite_noindex\":\"The error page for the {art} form carries noindex || Belt and braces alongside the status code. Not necessary, not harmful.\",\"befund_uneinheitlich\":\"The three forms answer differently: {stati} || A rule for .html, another for directories, and a catch-all for the rest \u2014 that is how the gap appears. Whether an address is missing should not depend on the shape of the path.\",\"befund_einheitlich_404\":\"All three forms answer with {status} || The same clear answer regardless of the shape of the address.\"};<\/p>\n<p>    var ENDPUNKT = '\/lw-fehlcheck.php';\n    var SITEKEY = '6LcrPkEtAAAAAPo1QCOf-IIM2fCL0UfdJz4y2iSY';\n    var STUFEN = ['hoch', 'mittel', 'niedrig', 'info', 'gut'];<\/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 zeichen(w) { return (typeof w === 'string' && w !== '') ? w : null; }\n    function text(schluessel, daten) {\n        var t = T[schluessel];\n        if (typeof t !== 'string') { return null; }\n        return t.replace(\/\\{([a-z_0-9]+)\\}\/g, function (m, k) {\n            var w = (daten && daten[k] !== undefined && daten[k] !== null) ? daten[k] : null;\n            if (w === null) { return m; }\n            if (k === 'art' && T['art_' + w]) { return T['art_' + w]; }\n            return String(w);\n        });\n    }\n    function kurz(url) {\n        var s = String(url || '').replace(\/^https?:\\\/\\\/\/, '');\n        return s.length <= 52 ? s : s.slice(0, 24) + '\u2026' + s.slice(-26);\n    }\n\n    function bewerten(antwort) {\n        var a = antwort || {};\n        if (a.fehler) { return { fehler: String(a.fehler), grund: a.grund || null, limit: zahl(a.limit) }; }\n        var befunde = liste(a.befunde).map(function (f) {\n            return { key: String(f.key || ''), stufe: STUFEN.indexOf(f.stufe) === -1 ? 'info' : f.stufe, daten: (f.daten &#038;&#038; typeof f.daten === 'object') ? f.daten : {} };\n        });\n        var gruppen = {};\n        STUFEN.forEach(function (s) { gruppen[s] = befunde.filter(function (f) { return f.stufe === s; }); });\n        var proben = liste(a.proben).map(function (z) {\n            return {\n                art: String(z.art || ''), url: String(z.url || ''), status: zahl(z.status), ort: zeichen(z.ort),\n                kb: zahl(z.kb), noindex: z.noindex === true, aehnlich: zahl(z.aehnlich)\n            };\n        });\n        var e = (a.echte &#038;&#038; typeof a.echte === 'object') ? a.echte : null;\n        return {\n            fehler: null, url: String(a.url || ''), wurzel: String(a.wurzel || ''),\n            urteil: (a.urteil === 'gut' || a.urteil === 'warnung' || a.urteil === 'kritisch') ? a.urteil : 'kritisch',\n            echte: e ? { url: String(e.url || ''), status: zahl(e.status), bytes: zahl(e.bytes) } : null,\n            proben: proben, befunde: befunde, gruppen: gruppen, dauer: zahl(a.dauer_ms), limitRest: zahl(a.limit_rest)\n        };\n    }\n\n    function skriptLaden() {\n        return new Promise(function (auf) {\n            if (window.grecaptcha) { auf(true); return; }\n            var s = document.createElement('script');\n            s.src = 'https:\/\/www.google.com\/recaptcha\/api.js?render=' + SITEKEY;\n            s.onload = function () { auf(true); }; s.onerror = function () { auf(false); };\n            document.head.appendChild(s);\n            setTimeout(function () { auf(!!window.grecaptcha); }, 8000);\n        });\n    }\n    function tokenHolen() {\n        return skriptLaden().then(function (da) {\n            if (!da || !window.grecaptcha || !window.grecaptcha.ready) { return null; }\n            return new Promise(function (auf) {\n                var fertig = false;\n                function einmal(w) { if (!fertig) { fertig = true; auf(w); } }\n                setTimeout(function () { einmal(null); }, 12000);\n                try {\n                    window.grecaptcha.ready(function () {\n                        if (fertig) { return; }\n                        if (!window.grecaptcha.execute) { einmal(null); return; }\n                        window.grecaptcha.execute(SITEKEY, { action: 'fehlcheck' }).then(function (t) { einmal(t || null); }, function () { einmal(null); });\n                    });\n                } catch (e) { einmal(null); }\n            });\n        }, function () { return null; });\n    }\n    function abfragen(url) {\n        return tokenHolen().then(function (token) {\n            return fetch(ENDPUNKT, { method: 'POST', headers: { 'Content-Type': 'application\/json' }, body: JSON.stringify({ url: url, token: token || '' }) })\n                .then(function (r) { return r.json().then(function (j) { return j; }, function () { return { fehler: 'antwort' }; }); }, function () { return { fehler: 'netz' }; });\n        });\n    }\n\n    window.LW_TEST = window.LW_TEST || {};\n    window.LW_TEST.FEHL = { bewerten: bewerten, darstellen: null, text: text, kurz: kurz, ENDPUNKT: ENDPUNKT, STUFEN: STUFEN, T: T };\n\n    var btn = document.getElementById('fehl-btn');\n    var out = document.getElementById('fehl-ausgabe');\n    if (!btn || !out) { return; }\n\n    function el(tag, stil, txt) { var e = document.createElement(tag); if (stil) { e.setAttribute('style', stil); } if (txt !== undefined &#038;&#038; txt !== null) { e.textContent = txt; } return e; }\n    function wert(id) { var e = document.getElementById(id); return e ? e.value : ''; }\n    var UEBERSCHRIFT = 'font-family: \"Nunito Sans\", sans-serif; font-weight: 700; color: var(--text-primary, #e8e8ee); font-size: 0.95rem; margin: 22px 0 8px;';\n    var ZELLE = 'padding: 5px 12px 5px 0; color: var(--text-secondary, #a0a0b0); font-size: 0.87rem;';\n    var ZELLE_WERT = 'padding: 5px 12px 5px 0; color: var(--text-primary, #e8e8ee); font-size: 0.87rem; font-family: monospace; word-break: break-all;';\n    var KASTEN = 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-radius: 8px; padding: 14px 16px; margin: 0 0 10px;';\n    var GUT = ' color: #7ee787;', WARN = ' color: #ffa94d;', ROT = ' color: #ff7b72;', GRAU = ' color: #8a8a99;';\n    var FARBEN = { hoch: '#ff7b72', mittel: '#ffa94d', niedrig: '#e3b341', info: '#8a8a99', gut: '#7ee787' };\n    var URTEIL = { gut: GUT, warnung: WARN, kritisch: ROT };\n    function gitter(sp) { return el('div', 'display: grid; grid-template-columns: ' + sp + '; gap: 0 18px; align-items: baseline;'); }\n    function paar(g, n, w, stil) { g.appendChild(el('div', ZELLE, n)); g.appendChild(el('div', ZELLE_WERT + (stil || ''), w)); }\n\n    function tabelle(b) {\n        var huelle = el('div', 'overflow-x: auto; margin: 0 0 6px;');\n        var t = el('table', 'border-collapse: collapse; width: 100%; min-width: 620px; font-size: 0.84rem;');\n        var kopf = el('tr', '');\n        [T.sp_art, T.sp_adresse, T.sp_status, T.sp_ziel, T.sp_groesse, T.sp_aehnlich, T.sp_noindex].forEach(function (n) {\n            kopf.appendChild(el('th', 'text-align: left; padding: 6px 12px 6px 0; color: #8a8a99; font-weight: 700; font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.4px; border-bottom: 1px solid var(--border, #2a2a35); white-space: nowrap;', n));\n        });\n        t.appendChild(kopf);\n        b.proben.forEach(function (z) {\n            var r = el('tr', '');\n            function zelle(txt, stil) { r.appendChild(el('td', 'padding: 7px 12px 7px 0; border-bottom: 1px solid var(--border, #2a2a35); font-family: monospace; color: var(--text-primary, #e8e8ee);' + (stil || ''), txt)); }\n            zelle(T['art_' + z.art] || z.art);\n            zelle(kurz(z.url), ' word-break: break-all;');\n            var gutStatus = z.status === 404 || z.status === 410;\n            zelle(z.status !== null ? String(z.status) : T.wert_fehlt, gutStatus ? GUT : (z.status === 200 ? ROT : WARN));\n            zelle(z.ort ? kurz(z.ort) : '-', GRAU);\n            zelle(z.kb !== null ? z.kb + ' KB' : '-', GRAU);\n            zelle(z.aehnlich !== null ? Math.round(z.aehnlich * 100) + ' %' : '-', (z.aehnlich !== null &#038;&#038; z.aehnlich >= 0.85) ? WARN : GRAU);\n            zelle(z.noindex ? T.wert_ja : T.wert_nein, GRAU);\n            t.appendChild(r);\n        });\n        huelle.appendChild(t);\n        return huelle;\n    }<\/p>\n<p>    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 && 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]));<\/p>\n<p>        var g = gitter('auto auto');\n        paar(g, T.zeile_vergleich, b.echte ? b.echte.url : (b.url || '-'), GRAU);\n        if (b.echte) { paar(g, T.zeile_vergleich_status, String(b.echte.status !== null ? b.echte.status : '-'), b.echte.status === 200 ? GUT : WARN); }\n        if (b.dauer !== null) { paar(g, T.zeile_dauer, b.dauer + ' ms', GRAU); }\n        if (b.limitRest !== null) { paar(g, T.zeile_limit, String(b.limitRest), GRAU); }\n        ziel.appendChild(g);<\/p>\n<p>        if (b.proben.length) {\n            ziel.appendChild(el('div', UEBERSCHRIFT, T.h_proben));\n            ziel.appendChild(tabelle(b));\n            ziel.appendChild(el('p', ZELLE + ' margin: 0 0 6px; font-size: 0.8rem;', T.tabelle_hinweis));\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 daten = {};\n                Object.keys(f.daten).forEach(function (n) { daten[n] = (n === 'url' || n === 'ziel') ? kurz(f.daten[n]) : f.daten[n]; });\n                var t = text('befund_' + f.key, daten) || f.key;\n                var teile = t.split(' || ');\n                k.appendChild(el('div', 'color: var(--text-primary, #e8e8ee); font-size: 0.9rem; font-weight: 700;', teile[0]));\n                if (teile[1]) { k.appendChild(el('div', ZELLE + ' padding: 6px 0 0; line-height: 1.55;', teile[1])); }\n                ziel.appendChild(k);\n            });\n        });\n        if (!irgendwas) { ziel.appendChild(el('p', ZELLE + ' margin: 0;', T.keine_befunde)); }\n    }\n    window.LW_TEST.FEHL.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        abfragen(wert('fehl-url')).then(function (a) { darstellen(bewerten(a), out); laeuft = false; btn.disabled = false; },\n            function () { darstellen(bewerten({ fehler: 'netz' }), out); laeuft = false; btn.disabled = false; });\n    });\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Asks three addresses that cannot exist \u2014 one without an extension, one ending in .html and one ending in a slash \u2014 and compares the answers with a page that does exist. A missing page answering 200 is the quiet failure: search engines index it, link checkers stay silent, and nobody notices the broken links.<\/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":[91094,92757,91315],"class_list":["post-15701","page","type-page","status-publish","hentry","tag-seo","tag-web-development","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>Soft 404 &amp; Error Page Checker: what a site answers for an address that does not exist - 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\/soft-404-error-page-checker\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Soft 404 &amp; Error Page Checker: what a site answers for an address that does not exist - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Asks three addresses that cannot exist \u2014 one without an extension, one ending in .html and one ending in a slash \u2014 and compares the answers with a page that does exist. A missing page answering 200 is the quiet failure: search engines index it, link checkers stay silent, and nobody notices the broken links.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/soft-404-error-page-checker\/\" \/>\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\\\/soft-404-error-page-checker\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/soft-404-error-page-checker\\\/\",\"name\":\"Soft 404 & Error Page Checker: what a site answers for an address that does not exist - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-09-05T22:47:38+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/soft-404-error-page-checker\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/soft-404-error-page-checker\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/soft-404-error-page-checker\\\/#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\":\"Soft 404 &#038; Error Page Checker: what a site answers for an address that does not exist\"}]},{\"@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":"Soft 404 & Error Page Checker: what a site answers for an address that does not exist - 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\/soft-404-error-page-checker\/","og_locale":"en_US","og_type":"article","og_title":"Soft 404 & Error Page Checker: what a site answers for an address that does not exist - Lukas Wojcik - Blog","og_description":"Asks three addresses that cannot exist \u2014 one without an extension, one ending in .html and one ending in a slash \u2014 and compares the answers with a page that does exist. A missing page answering 200 is the quiet failure: search engines index it, link checkers stay silent, and nobody notices the broken links.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/soft-404-error-page-checker\/","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\/soft-404-error-page-checker\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/soft-404-error-page-checker\/","name":"Soft 404 & Error Page Checker: what a site answers for an address that does not exist - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-09-05T22:47:38+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/soft-404-error-page-checker\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/soft-404-error-page-checker\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/soft-404-error-page-checker\/#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":"Soft 404 &#038; Error Page Checker: what a site answers for an address that does not exist"}]},{"@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\/15701","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=15701"}],"version-history":[{"count":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/15701\/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=15701"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=15701"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}