Tools

Broken link checker

A broken link checker crawls a site, collects every link it finds, requests each target and records the HTTP status returned. Targets answering 404 or 410 are broken; 5xx means the server failed and should be re-tested; 401 and 403 usually mean the target refused an automated request rather than that it is missing. The value of a checker is not the test itself — one link can be tested with curl — but doing it across every page without missing the ones nobody remembers.

What it does, step by step

Discovery: starting from the home page, it follows internal links to build the list of pages, bounded by the crawl budget and by robots.txt.

Extraction: from each page it collects the link targets — anchors, and the resources the page references.

Testing: it requests each target and records the status, following redirects and noting each hop.

Attribution: it records which page each broken link was found on, which is what turns a list of dead URLs into a list of edits.

What a clean result looks like

No internal link resolving to 404 or 410.

Redirect chains of at most one hop, with internal links pointing at final destinations rather than at redirects.

External links either resolving or explicitly accounted for — a 403 from a site known to block automated clients is not a defect on your side.

And, importantly, a coverage figure you believe: the count of pages examined, and the reasons any were not.

What a problematic result looks like

Internal 404s, especially in clusters — one navigation component or one template pointing at a path that no longer exists.

Links whose targets differ only in case, which after a migration between systems is a recurring cause.

Redirect chains of three or more hops, which are slower and hide breakage at the end.

A page count far below the site's real size, which means the result describes a fraction of it.

The limits, stated plainly

Links behind a login are not reached: the crawl is anonymous.

Links inserted by scripts after load may not appear in the HTML the crawler reads.

Pages disallowed by robots.txt are not fetched, and the report says so rather than treating them as clean.

A 200 means reachable, not correct. A link pointing at the wrong existing page is invisible to any status-based check.

What VeriFixScan uses

`availability.broken_links` reports broken targets with the page each was found on. `availability.status_classification` groups the status codes encountered. `transport.redirect_chain` reports the chains separately, since a link reached through four hops is a different defect from a dead one.

The crawl reports the pages it could not reach and the reason, so an empty finding reads as "nothing broken in what was covered".

Reading the report without losing a day to it

A first run on a site of any age returns more rows than anyone wants to work through, and most of the rows are not worth the same attention. Triage before editing.

Internal 404s first, grouped by target. Twenty rows pointing at the same dead URL are one edit in a navigation component or one redirect, not twenty edits. This group is almost always where the real defects are.

Then internal links that resolve through a chain. Not urgent, and cheap to fix while the file is already open.

Then external 404s and 410s, checked in a browser before removal. A page that genuinely disappeared wants the link removed or repointed; often a replacement exists at a new address.

External 403s, 401s and 429s last, and expect most to be false alarms: these are servers declining an automated client, and a browser usually loads them without complaint.

The row that deserves suspicion rather than action is a whole external domain failing at once. That is far more likely to be the domain blocking the crawler than every one of its pages disappearing on the same day.

Frequently asked questions

How is this different from testing one URL with curl?
It is the same test, applied to every link on every page the crawler reaches, with the source page recorded. The test is trivial; the coverage is the work.
Does it check external links too?
Yes, and those produce most of the false alarms. Other servers block automated clients, so a 403 from an external target is usually bot protection rather than a dead page.
Will it find links in a JavaScript application?
It finds links present in the HTML the server returns, and VeriFixScan renders pages when a dynamic site is detected. Links that appear only after a user interaction are outside any crawl.

Sources

Related

VeriFixScan crawls a site and applies its checks to every page it reaches, keeping the evidence behind each finding. Scanning one website is free.

Scan a website