<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Swift Labs</title>
    <description>The latest articles on DEV Community by Swift Labs (@swiftlabs).</description>
    <link>https://dev.to/swiftlabs</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4193533%2F05260f6e-c396-4316-98c5-3d82fee02472.png</url>
      <title>DEV Community: Swift Labs</title>
      <link>https://dev.to/swiftlabs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/swiftlabs"/>
    <language>en</language>
    <item>
      <title>Broken Link Checking for Docs Sites: Build-Time Checks Plus Live Monitoring</title>
      <dc:creator>Swift Labs</dc:creator>
      <pubDate>Wed, 21 Oct 2026 14:08:55 +0000</pubDate>
      <link>https://dev.to/swiftlabs/broken-link-checking-for-docs-sites-build-time-checks-plus-live-monitoring-jce</link>
      <guid>https://dev.to/swiftlabs/broken-link-checking-for-docs-sites-build-time-checks-plus-live-monitoring-jce</guid>
      <description>&lt;p&gt;Documentation sites are hard on links. They're full of cross-references between pages, anchors to specific sections, links to API references, code repositories, changelogs and third-party docs, and all of those move. Pages get renamed when the product changes, versions get archived, and the external projects you link to restructure their own docs. A reader who follows a "see Configuration" link and lands on a 404 in the middle of a task is a frustrated reader, and often becomes a support ticket.&lt;/p&gt;

&lt;p&gt;The good news is that docs teams have better tools for this than most websites, because docs are usually built from source files. The catch is that build-time checks only catch some problems. This guide covers both halves: what to check during the build, and what you can only catch by checking the live site.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three kinds of broken docs links
&lt;/h2&gt;

&lt;p&gt;It helps to separate them, because different tools catch each kind.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Internal page links.&lt;/strong&gt; A link from one doc page to another that doesn't exist (renamed file, deleted page, typo in a relative path). Your static site generator can catch these at build time, because it knows every page that exists.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anchor links.&lt;/strong&gt; A link to &lt;code&gt;/config#retry-options&lt;/code&gt; when the heading is now "Retry settings", so the anchor is &lt;code&gt;#retry-settings&lt;/code&gt;. The page loads, so nothing returns a 404, but the reader lands at the top of a long page instead of the section they wanted. Some generators can check these. Many link checkers ignore them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;External links.&lt;/strong&gt; Links to GitHub, package registries, other projects' docs, blog posts and standards. Your build can't know whether these work, so you need a checker that makes real HTTP requests, and those links can break at any time after you deploy.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There's a fourth, sneakier kind: &lt;strong&gt;links that work in the build but break in production.&lt;/strong&gt; Server-level redirects, a base path that's different in production, a CDN rule, or a versioned-docs setup where old versions point at pages that only exist in the latest version. Only a check against the live site finds these.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 1: Turn on your generator's own checks
&lt;/h2&gt;

&lt;p&gt;Start here. It's free and takes a few minutes. Exact option names vary between versions, so check your generator's docs for the version you run.&lt;/p&gt;

&lt;h3&gt;
  
  
  Docusaurus
&lt;/h3&gt;

&lt;p&gt;Docusaurus checks internal links when you run a production build, and the &lt;code&gt;onBrokenLinks&lt;/code&gt; option in &lt;code&gt;docusaurus.config.js&lt;/code&gt; controls what happens when it finds one. In current versions the default is &lt;code&gt;'throw'&lt;/code&gt;, which fails the build. Keep it that way. There are related options for broken Markdown file links and for broken anchors (&lt;code&gt;onBrokenAnchors&lt;/code&gt;, which defaults to a warning in the versions that have it). If you can, set anchors to throw as well, so renamed headings fail the build instead of quietly sending readers to the top of the page.&lt;/p&gt;

&lt;p&gt;Note that these checks happen during &lt;code&gt;docusaurus build&lt;/code&gt;, not in the dev server, so make sure CI runs a real build on every pull request.&lt;/p&gt;

&lt;h3&gt;
  
  
  MkDocs
&lt;/h3&gt;

&lt;p&gt;Run &lt;code&gt;mkdocs build --strict&lt;/code&gt; in CI. Strict mode turns warnings, including warnings about links to documentation files that don't exist, into a failed build. Recent MkDocs versions also have a &lt;code&gt;validation&lt;/code&gt; section in &lt;code&gt;mkdocs.yml&lt;/code&gt; that controls how strictly different link problems are treated, including anchors. MkDocs validates links &lt;em&gt;between your Markdown files&lt;/em&gt;. It doesn't check external URLs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sphinx
&lt;/h3&gt;

&lt;p&gt;Sphinx warns about broken cross-references during a normal build (&lt;code&gt;-W&lt;/code&gt; turns warnings into errors, and &lt;code&gt;-n&lt;/code&gt; "nitpicky" mode reports missing references more aggressively). For external URLs it ships a dedicated builder: &lt;code&gt;sphinx-build -b linkcheck&lt;/code&gt; (or &lt;code&gt;make linkcheck&lt;/code&gt;) requests every external link and writes a report. It's slow on large sites, so most teams run it on a schedule rather than on every commit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hugo
&lt;/h3&gt;

&lt;p&gt;Hugo's &lt;code&gt;ref&lt;/code&gt; and &lt;code&gt;relref&lt;/code&gt; shortcodes fail or warn (depending on &lt;code&gt;refLinksErrorLevel&lt;/code&gt;) when they point at a page that doesn't exist. Plain Markdown links aren't checked, so teams that care use &lt;code&gt;ref&lt;/code&gt;/&lt;code&gt;relref&lt;/code&gt; for internal links and an external checker for everything else.&lt;/p&gt;

&lt;h3&gt;
  
  
  Everything else (GitBook, Mintlify, ReadMe, custom setups)
&lt;/h3&gt;

&lt;p&gt;Hosted docs platforms vary a lot. Some flag broken internal links in their editor, some don't, and few check external links on a schedule. If yours doesn't, you'll rely more on Layers 2 and 3.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 2: Run a link checker in CI
&lt;/h2&gt;

&lt;p&gt;Build checks handle internal links. For external links, add a dedicated link checker to your CI pipeline. Common choices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;lychee&lt;/strong&gt;, a fast link checker written in Rust that works on Markdown, HTML and plain text. It has an official GitHub Action (&lt;code&gt;lycheeverse/lychee-action&lt;/code&gt;) and supports caching, exclusions and retries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;markdown-link-check&lt;/strong&gt;, a Node tool that checks links in Markdown files and is popular in smaller repos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generator-specific actions&lt;/strong&gt;, such as the MkDocs link-check GitHub Action, which wrap a checker with sensible defaults for that generator.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A few lessons that save a lot of frustration:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't block pull requests on external links.&lt;/strong&gt; An external site going down for ten minutes shouldn't stop someone merging a typo fix. Block PRs on &lt;em&gt;internal&lt;/em&gt; link failures (Layer 1). Run external checks on a schedule or as a non-blocking job, and open an issue when something fails.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Expect bot-blocking.&lt;/strong&gt; Some sites answer automated requests with 403, 429 or other non-200 codes while working fine in a browser. Social networks and some large platforms are known for it. Keep an exclusion list for known false positives, and review it every few months, because "excluded" can quietly turn into "never checked."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Retry before failing.&lt;/strong&gt; Use your checker's retry settings, or have it check twice before reporting. A single timeout isn't a broken link.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use caching on a schedule.&lt;/strong&gt; Checking every external link in a large docs repo on every run is slow and can get you rate-limited. Caching results for a day or so is a reasonable compromise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 3: Monitor the live site
&lt;/h2&gt;

&lt;p&gt;Layers 1 and 2 check your &lt;em&gt;source&lt;/em&gt;. Your readers use the &lt;em&gt;deployed site&lt;/em&gt;, and the two differ more than you'd think:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Redirects and rewrites&lt;/strong&gt; set up in your host, CDN or reverse proxy don't exist in the build environment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Base paths and versioning.&lt;/strong&gt; Docs served under &lt;code&gt;/docs/v2/&lt;/code&gt; can behave differently from the local build, especially with versioned docs where old versions link to paths that only exist in newer ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generated content.&lt;/strong&gt; API references generated from code, embedded changelogs or content pulled in at deploy time may never be seen by the source checker.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Things that break after deploy.&lt;/strong&gt; Every external link you checked at build time can break next week. If you only check on commits, a docs section nobody edits never gets rechecked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assets.&lt;/strong&gt; Images, downloadable files and embedded media served from a separate bucket or CDN.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A scheduled crawl of the live site catches all of these. It works the way a reader does: it starts at your docs homepage, follows links, and records every link and image that returns an error, along with the page it was found on. Weekly is enough for most docs sites. If you deploy docs many times a day, run it daily and alert only on &lt;em&gt;new&lt;/em&gt; breakage, so the alerts don't become noise.&lt;/p&gt;

&lt;p&gt;Any crawler that records the "found on" page for each broken link works here: a scheduled lychee run against the deployed URL, a hosted monitor, or a small script of your own. What matters is that it hits the live site, rechecks failures before reporting them, and compares each run with the previous one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Docs-specific habits that prevent breakage
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Redirect when you rename.&lt;/strong&gt; Most docs platforms and hosts support redirect maps. Make "add a redirect" part of the checklist for renaming or moving any page, the same way you'd update the sidebar. Old docs URLs get bookmarked, linked from forum answers and Stack Overflow, and cited in other projects' docs, so they need to keep working.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Link to stable URLs.&lt;/strong&gt; For external references, prefer permalinks: tagged release URLs instead of &lt;code&gt;main&lt;/code&gt; branch file links (which break when files move), versioned API docs instead of "latest" where the content matters, and DOIs or archived copies for papers and specs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Link to headings deliberately.&lt;/strong&gt; If your generator lets you set explicit heading IDs, use them for sections that get linked often. Then changing the heading text doesn't change the anchor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep an eye on archived versions.&lt;/strong&gt; Versioned docs multiply your link count. Decide how far back you'll maintain links. For versions you've frozen, you can exclude external links from checks and add a banner pointing readers to the current version.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Give link reports an owner.&lt;/strong&gt; Route scheduled link failures to a real place, such as a docs issue label, a Slack channel or a weekly triage, with a named owner. A report nobody owns gets ignored.&lt;/p&gt;

&lt;h2&gt;
  
  
  A setup that covers all three layers
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Every pull request:&lt;/strong&gt; production build with the generator's broken-link checks set to fail (internal pages, plus anchors if supported).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nightly or weekly in CI:&lt;/strong&gt; lychee or similar against the source for external links, non-blocking, opening an issue when something fails.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weekly (daily if you deploy often):&lt;/strong&gt; a crawl of the live docs site, alerting only on new breakage, with the "found on" page included.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Always:&lt;/strong&gt; redirects for moved pages, stable external URLs, and explicit IDs for frequently linked headings.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://deadlinkpatrol.com/blog/broken-link-checker-for-documentation-sites" rel="noopener noreferrer"&gt;DeadLinkPatrol blog&lt;/a&gt;. We build DeadLinkPatrol, a scheduled broken-link checker. If you want to see what a live crawl finds on your own site, the &lt;a href="https://deadlinkpatrol.com/check" rel="noopener noreferrer"&gt;free checker&lt;/a&gt; scans up to 25 pages without signup.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article was created with the help of AI and checked for accuracy before publishing.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>documentation</category>
      <category>devops</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Search Console "Not Found (404)" Errors: Which to Fix and Which to Ignore</title>
      <dc:creator>Swift Labs</dc:creator>
      <pubDate>Mon, 19 Oct 2026 07:34:44 +0000</pubDate>
      <link>https://dev.to/swiftlabs/search-console-not-found-404-errors-which-to-fix-and-which-to-ignore-16l6</link>
      <guid>https://dev.to/swiftlabs/search-console-not-found-404-errors-which-to-fix-and-which-to-ignore-16l6</guid>
      <description>&lt;p&gt;Open the Page indexing report in Google Search Console on almost any site that has been around for a while and you'll find a "Not found (404)" row, sometimes with hundreds or thousands of URLs. It looks like an emergency. Most of the time it isn't, but a few of those URLs probably do matter, and the trick is to work out which ones.&lt;/p&gt;

&lt;p&gt;This guide explains what Google actually says about 404s, gives you a simple triage to sort the list into "fix", "redirect" and "leave alone", and shows how to stop the list from growing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Google says about 404s
&lt;/h2&gt;

&lt;p&gt;It's worth starting from Google's own documentation rather than SEO folklore.&lt;/p&gt;

&lt;p&gt;In the Search Console help for the Page indexing report, Google describes a "Not found (404)" URL as one that "returned a 404 error when requested," discovered "without any explicit request or sitemap," possibly "as a link from another page, or possibly the page existed before and was deleted." It then says plainly: &lt;strong&gt;"404 responses are not necessarily a problem, if the page has been removed without any replacement. If your page has moved, use a 301 redirect to the new location."&lt;/strong&gt; It also notes that Googlebot "will probably continue to try this URL for some period of time" and "will crawl it less and less often."&lt;/p&gt;

&lt;p&gt;Google's developer documentation on HTTP status codes adds that all 4xx errors except 429 are treated the same way: the URL is removed from the index if it was indexed before, "newly encountered 404 pages aren't processed," and "the crawling frequency gradually decreases."&lt;/p&gt;

&lt;p&gt;That gives you two practical conclusions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A 404 is the correct response for a page that's genuinely gone.&lt;/strong&gt; Returning one doesn't penalize your site.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A 404 on a URL that &lt;em&gt;should&lt;/em&gt; work is a real problem.&lt;/strong&gt; It's not a penalty either, but the page drops out of the index and any traffic or link value it had is lost.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So you're not trying to get the 404 count to zero. You're trying to find the 404s that shouldn't be 404s.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Export the list
&lt;/h2&gt;

&lt;p&gt;In Search Console, go to &lt;strong&gt;Indexing → Pages&lt;/strong&gt;, click the &lt;strong&gt;Not found (404)&lt;/strong&gt; row, and export the examples. Search Console shows a sample of affected URLs, not necessarily every one, so treat the export as a starting point rather than a full inventory.&lt;/p&gt;

&lt;p&gt;Add two columns to the spreadsheet: &lt;strong&gt;Category&lt;/strong&gt; and &lt;strong&gt;Action&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Sort every URL into one of five buckets
&lt;/h2&gt;

&lt;p&gt;Go through the list (filter by URL pattern to speed it up) and put each URL into one of these buckets.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bucket A: Pages that moved and still have an equivalent
&lt;/h3&gt;

&lt;p&gt;A product renamed from &lt;code&gt;/blue-widget&lt;/code&gt; to &lt;code&gt;/widgets/blue&lt;/code&gt;. A blog post whose slug changed. A service page merged into another service page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Action: 301 redirect to the closest equivalent.&lt;/strong&gt; This is exactly what Google's help recommends, and it's the most valuable fix on the list, because these URLs often had rankings, backlinks, or both.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bucket B: Pages deleted on purpose with no replacement
&lt;/h3&gt;

&lt;p&gt;A discontinued product with no successor. An event from 2019. A job ad that has been filled.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Action: leave it as a 404 (or a 410 if you want to signal "gone for good").&lt;/strong&gt; Don't redirect these to the homepage. Google tends to treat irrelevant redirects like that as soft 404s anyway, and users who land on your homepage instead of what they clicked get confused. If the deleted page had good backlinks and there's a &lt;em&gt;genuinely related&lt;/em&gt; page, such as the category it belonged to, a redirect there is reasonable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bucket C: URLs that never existed
&lt;/h3&gt;

&lt;p&gt;Typos in links on other sites, URLs with junk parameters, spam bots probing &lt;code&gt;/wp-login.php&lt;/code&gt; on a site that isn't WordPress, paths with tracking garbage tacked on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Action: ignore.&lt;/strong&gt; You don't control other people's typos, and these URLs never had value. The exception is a typo'd URL that has a strong backlink pointing at it. A redirect to the intended page recovers that value.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bucket D: URLs created by your own broken links
&lt;/h3&gt;

&lt;p&gt;This is the bucket people miss. The URL is in Search Console because &lt;strong&gt;your own site links to it&lt;/strong&gt;. Common causes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A link edited in one place but not in another (old menu item, footer, sidebar widget)&lt;/li&gt;
&lt;li&gt;A relative link missing its protocol: an editor types &lt;code&gt;example.com/page&lt;/code&gt; instead of &lt;code&gt;https://example.com/page&lt;/code&gt;, and the browser resolves it relative to the current page, so you get &lt;code&gt;/about/example.com/page&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;A template that builds URLs from data that's sometimes empty (&lt;code&gt;/products/&lt;/code&gt; + nothing)&lt;/li&gt;
&lt;li&gt;Links in old blog posts pointing at pages that have since moved&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Action: fix the link at the source, and add a redirect if the URL has external value.&lt;/strong&gt; A redirect alone isn't enough. If your own pages link to a 404, every visitor who clicks it hits a dead end, and internal links pass through a redirect hop for no reason. Find the page that contains the link and edit it.&lt;/p&gt;

&lt;p&gt;Search Console's URL Inspection tool can sometimes show you where Google found a URL, but it doesn't reliably list every page that links to it. A crawler that records the source page for every broken link, the "found on" page, is the faster way to find these.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bucket E: URLs that should work but don't
&lt;/h3&gt;

&lt;p&gt;The URL is correct, the page should exist, and it returns 404 anyway. Typical causes are a deployment that dropped a route, a CMS page set to draft by mistake, a permalink flush that didn't run, or a server rule that's too broad.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Action: fix the page itself. This is a bug, not a content decision.&lt;/strong&gt; If a Bucket E URL is a revenue page (pricing, checkout, contact, booking), it's the most urgent item on the whole list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Prioritize
&lt;/h2&gt;

&lt;p&gt;With everything bucketed, work in this order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Bucket E on important pages.&lt;/strong&gt; Broken pages that should be working.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bucket D.&lt;/strong&gt; Your own links pointing at 404s, starting with sitewide elements (menus, footers), because one fix there repairs hundreds of instances.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bucket A, ordered by value.&lt;/strong&gt; If you can see which moved URLs had traffic (in analytics or Search Console's performance report) or backlinks (in any backlink tool), redirect those first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bucket C typos with strong backlinks.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Everything else in B and C: nothing to do.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;On a typical site, steps 1 and 2 involve a fairly short list and do most of the good.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Validate and wait
&lt;/h2&gt;

&lt;p&gt;After fixing, you can use &lt;strong&gt;Validate fix&lt;/strong&gt; on the Not found (404) row in Search Console. Expect it to take a while. Google rechecks on its own schedule, and the help docs say Googlebot keeps trying removed URLs "for some period of time." URLs you intentionally left as 404s will stay in the report for a while, and that's fine.&lt;/p&gt;

&lt;p&gt;Don't judge your work by whether the 404 count goes down. Judge it by whether the URLs in buckets A, D and E now resolve correctly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Search Console alone isn't enough
&lt;/h2&gt;

&lt;p&gt;Search Console is a good &lt;em&gt;lagging&lt;/em&gt; indicator, but it has gaps for this job:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It's slow.&lt;/strong&gt; URLs show up after Googlebot crawls them, which can be days or weeks after a link broke.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's a sample.&lt;/strong&gt; The export won't necessarily include every affected URL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It only sees what Google crawls.&lt;/strong&gt; It won't show broken links in pages Google skips, in noindexed sections, or links to &lt;em&gt;external&lt;/em&gt; sites that have died. Your visitors still click those.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It mixes good 404s with bad ones.&lt;/strong&gt; You have to do the triage above every time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A scheduled link crawler fills these gaps. It works from your side: it crawls your pages, checks every link it finds, and tells you which page each broken link sits on, usually within a day of the break. That turns Bucket D from detective work into a to-do list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stopping new 404s from building up
&lt;/h2&gt;

&lt;p&gt;A few habits keep the report small:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Redirect when you rename.&lt;/strong&gt; Make "add a 301" part of the process for changing any published URL. Most CMSs have redirect plugins or settings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scan after big changes.&lt;/strong&gt; Migrations, redesigns, permalink changes and bulk deletions all need a crawl before and after.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paste full URLs.&lt;/strong&gt; Train editors to paste links with &lt;code&gt;https://&lt;/code&gt;, or use a CMS link picker for internal links.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitor on a schedule.&lt;/strong&gt; Weekly for most sites, daily for stores and client sites you're paid to maintain, with alerts only for &lt;em&gt;new&lt;/em&gt; breakage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check your sitemap.&lt;/strong&gt; A sitemap that lists 404 URLs sends Google mixed signals. Regenerate it after deletions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;404s for pages that are really gone are normal. Google says so.&lt;/li&gt;
&lt;li&gt;Redirect moved pages to their closest equivalent with a 301.&lt;/li&gt;
&lt;li&gt;Fix your &lt;em&gt;own&lt;/em&gt; links that point to 404s at the source. This is the most commonly missed fix.&lt;/li&gt;
&lt;li&gt;Treat a 404 on a page that should exist as a bug, and fix it first.&lt;/li&gt;
&lt;li&gt;Ignore typos and junk URLs unless they carry real backlinks.&lt;/li&gt;
&lt;li&gt;Use a crawler that records the "found on" page, so you can see where the broken links come from without waiting for Google.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://deadlinkpatrol.com/blog/search-console-404-errors-fix-or-ignore" rel="noopener noreferrer"&gt;DeadLinkPatrol blog&lt;/a&gt;. We build DeadLinkPatrol, a scheduled broken-link checker. If you want to see what a live crawl finds on your own site, the &lt;a href="https://deadlinkpatrol.com/check" rel="noopener noreferrer"&gt;free checker&lt;/a&gt; scans up to 25 pages without signup.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article was created with the help of AI and checked for accuracy before publishing.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>google</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
