Internal Link Checker
Enter any URL to find the broken internal links in its body copy. Redirects, nofollowed internal links and anchors that describe nothing are reported alongside them, template links are kept out of the way, and every row says what to do about it.
Short answer
An internal link checker reports which of a page's own links are defective rather than counting them. This one separates the links written into the body copy from those the template repeats sitewide, requests up to 30 in-copy destinations, and lists broken links first, then redirects, nofollowed internal links and vague anchors. Links answering 401, 403, 429 or 451 are listed apart: a bot block is not a missing page.
The five things that go wrong with an internal link
Internal links fail in ways that look alike in a spreadsheet and need completely different work. The checker sorts by what it costs to leave each one alone, so the top of the table is always the thing to do first.
| What the checker found | Cost of leaving it | What to do |
|---|---|---|
| Broken: 404, 410 or 5xx | A dead end for readers, a wasted fetch for crawlers, equity thrown away | Point the link at a live URL, restore the page, or remove the link |
| No answer: timed out | Unknown, which is its own problem | Open it yourself. A slow server is not a missing page |
| Redirect: 301 or 302 | A round trip on every follow, and the seed of a redirect chain | Link straight to the final URL |
| Nofollowed internal link | Equity withheld from your own page, usually by accident | Drop the rel unless you meant it; use noindex or robots.txt if indexing was the real concern |
| Anchor describes nothing | A crawler learns nothing; a screen reader user gets a list of identical links | Name the destination in the link text |
| Image link with no alt text | The link has no accessible name at all | Describe the destination in the image's alt attribute |
| Blocked: 401, 403, 429, 451 | Nothing. This is not a defect | Check it in a browser before touching the link |
A bot block is not a broken link
The last row is the one that matters most in practice. Bulk link checkers report bot blocks as red rows, people believe them, and working links get deleted. This tool keeps them in a separate list with that warning attached.
Why the template links are kept out of the way
Most of the links on any page were not written for that page. A navigation bar, a footer and a sidebar repeat on every URL on the site, and a checker that counts them equally tells you the same thing on every page you run. Worse, one broken footer link will be reported on all of them, so the genuine finding on page forty is buried under thirty-nine copies of a problem you already knew about.
This checker draws the boundary first and checks only what is inside it. It looks for a <main> element, an <article>, or a role="main" wrapper. When a page has none of those it falls back to removing nav, header, footer, aside and form from the body, and says in the results that it did so. Wrapping your content in <main> makes the split exact, for this tool and for assistive technology.
Template links are still counted. The summary reports how many there were, which is the number worth glancing at: when a page's body copy holds three internal links and the template holds ninety, the page is a leaf on someone else's navigation rather than a node in your content.
Working through the findings in a useful order
A list of link defects is a to-do list without an order until you put one on it. This is the sequence the table already uses, and the reasoning behind it.
- 01
Check a page that earns something, not the homepage
A homepage is almost all template links, and template links are the theme's job rather than the page's. Point the checker at an article, a guide or a category page: somewhere a person wrote the links by hand, which is where the defects live.
- 02
Fix the broken links before anything else
A broken internal link costs a reader a dead end and a crawler a wasted fetch, and unlike a broken outbound link it is entirely yours to fix. Every other finding on the page can wait behind this one.
- 03
Tell a bot block apart from a dead page
A 401, 403, 429 or 451 means a crawler was turned away, not that the page is missing. Those are listed apart from the broken links for that reason. Open one in a browser before you touch the link.
- 04
Shorten the redirects you link through
An internal link pointing at a redirect works and costs a round trip every time anyone follows it. Point it at the final URL instead. This is also how redirect chains stop forming, because the second move is always another redirect added in front of the first.
- 05
Decide whether each nofollow was deliberate
Nofollow on your own pages withholds equity from yourself. Most internal nofollows arrive by template accident rather than by choice, usually on login, cart or filter URLs where a noindex or a robots rule was the tool actually wanted.
- 06
Rewrite the anchors that describe nothing
Click here, read more and this page tell a crawler nothing about the destination and leave a screen reader user with a list of identical links. Describe where the link goes instead. This costs nothing today, which is why it is last.
What this cannot tell you
One page's outgoing links are a keyhole view of a link graph. Three questions that matter need the whole site, and no single-page checker can answer them:
- Which of your pages are orphans, with no internal link pointing at them at all. That needs every page crawled, not one.
- Which pages are too deep, sitting five or six clicks from the homepage where crawlers arrive late and rarely.
- Whether the pages you care about are the ones receiving the most internal links, which is the question internal linking actually exists to answer.
Those are a crawl, and a crawl joined to Search Console is what makes the answers actionable. The underlying idea, that links pass value between your own pages, is link equity, and the practice of directing it deliberately is internal linking. Until then, run this on the pages that earn you something and fix what it finds.
What this internal link checker reports
Broken internal links first
404, 410 and 5xx destinations lifted to the top of the table
Body copy split from template
Nav, header and footer links counted but kept out of the findings
Redirects called out
Internal links pointing at a 301 or 302, with the destination they land on
Nofollowed internal links
How many of a destination's links carry a rel that discards their value
Anchors that describe nothing
Click here, read more and the rest, flagged only in the body copy
Image links with no alt
Image-only links left with no accessible name for the destination
Bot blocks kept separate
401, 403, 429 and 451 listed apart, because they are not broken links
The fix on every row
What to change, not just what is wrong
What this reads, and what it cannot
Frequently asked questions
What is an internal link checker?
It is a tool that reads the internal links on a page and reports which ones are defective, rather than describing how many there are. This one fetches the page, separates the links a person wrote in the body copy from the ones the template repeats on every page, requests each in-copy destination, and reports the ones that return an error, redirect, carry rel="nofollow", or use an anchor that describes nothing. Each row comes with the fix it needs.
What is the difference between this and the internal link analyzer?
They run the same crawl and answer different questions. The internal link analyzer describes the link graph: how many links, where they point, how the body copy compares with the template. This checker leads with what is wrong and what to do about it. If you want to understand a page's linking, use the analyzer; if you want a list of things to fix, use this.
Why does it only check the links in the body copy?
Because template links repeat on every page, so a broken nav link would be reported once on every URL you check and bury the links the page's author can actually act on. The tool finds the content boundary from a main, article or role="main" wrapper, falling back to stripping nav, header, footer, aside and form from the body. Template links are still counted and reported as a total, just not checked one by one.
How many links does it check per run?
It reads up to 300 destinations on a page and fetches a status for the first 30 in-copy ones. The fetch limit is there so one run cannot hammer another server. When a page has more in-copy destinations than that, the extra ones are reported as found but unchecked, so you always know the difference between a link that passed and a link nobody looked at.
Does a broken internal link hurt SEO?
Directly, less than people assume: Google does not demote a page for linking to a 404. Indirectly it costs real things. Crawl budget goes on fetches that return nothing, the equity that link was meant to pass evaporates, and a reader who hits a dead end leaves. On a large site the crawl waste is the part that matters, because every fetch spent on a dead URL is one not spent on a page you want indexed.
Should internal links ever be nofollowed?
Rarely, and almost never for the reason people think. PageRank sculpting stopped working in 2009: nofollow stopped redirecting equity to your other links and started discarding it instead. The legitimate uses are narrow, such as user-generated links in comments. For a login, cart, or faceted filter URL you almost always want a noindex tag or a robots.txt rule, which control indexing and crawling, rather than a nofollow, which only throws away the link's value.
What counts as an anchor that describes nothing?
Phrases that describe the act of clicking rather than the destination: click here, read more, this page, learn more, find out more, details, continue. They matter twice over. A crawler takes anchor text as a description of the destination and learns nothing from these, and a screen reader user who pulls up a list of a page's links sees eight entries all reading read more. The fix is to name the destination in the link text.
What is an orphan page, and will this find one?
An orphan page is one that no internal link points at, so it can only be discovered through a sitemap or an external link. This tool checks one page's outgoing links, so it cannot see the whole graph and cannot tell you which of your pages are orphans. That needs a crawl of the entire site, which is what the CrawlRaven audit does.
Why is a link reported as a redirect rather than broken?
Because it works. A 301 or 302 resolves, the reader arrives, and nothing is on fire. It is still worth fixing: every follow costs an extra round trip, and the next time someone moves that page the redirect is added in front of the existing one rather than replacing it, which is how a two-hop chain becomes a five-hop chain. Pointing the link at the final URL ends it.
Does it find links added by JavaScript?
No. It reads the HTML your server returns, which is what a crawler sees on its first pass. Links inserted in the browser are not in that response and are not counted. If the tool reports far fewer links than the page visibly has, that gap is itself the finding: a crawler may not follow those links either, or may only find them after a rendering pass that is queued and can lag by days.
Can I check a page behind a login?
No. The tool requests the URL anonymously, the same way a crawler does, so a page that needs a session returns a login page or a 401. That is the correct answer for SEO purposes, since a page a crawler cannot reach is a page that cannot be indexed, but it means the tool is no use for auditing a members area or a staging site behind basic auth.
How many internal links should a page have?
There is no number worth chasing, and any tool quoting one is guessing. What matters is whether the links are in the writing and whether they go somewhere useful. A 2,000-word guide with two in-copy internal links is a dead end that receives equity and passes none on, and that is a real finding. The same page with forty links stuffed in to hit a target is worse, because none of them means anything.
Other crawl and indexing tools
Website URL Extractor
Crawl any website and download every URL it links to as CSV, TXT, or JSON. Works straight from the live site, no sitemap required.
Use toolRedirect Chain Checker
Trace every redirect hop with status codes and response times. Detect loops, long chains, protocol downgrades, and 302 misuse.
Use tool404 Error Checker
Paste up to 100 URLs and find the dead ones. Hard 404s, 410s and server errors first, soft 404s that answer 200 flagged beside them, with the fix on every row.
Use toolHTTP Status Code Checker
Check the status code of up to 100 URLs at once: 200, 301, 404, 410 or 5xx, with every redirect hop, possible soft 404s and response times.
Use toolWebsite Speed Test
Test a page on mobile or desktop: real-visitor Core Web Vitals (LCP, INP, CLS) next to the Lighthouse score, with fixes sorted by time saved.
Use toolPage Indexability Checker
Find out why a page is not indexed. Checks status codes, noindex tags and X-Robots-Tag headers, robots.txt rules, canonicals, sitemap membership, and rendered content.
Use toolBroken Link Checker
Find links that no longer work, internal and external together. Checks up to 50 links on a page for 404 errors, redirects, and timeouts.
Use toolExternal Link Checker
Audit who a page links out to and on what terms. Destinations grouped by domain, with rel nofollow, sponsored and ugc, new-tab safety, and live status.
Use toolInternal Link Analyzer
See which internal links a page makes in its own writing and which come from the template, grouped by destination, with anchor text, nofollow and live status.
Use toolRobots.txt Tester
Analyze robots.txt to see which AI crawlers and search engines are blocked, find sitemaps, and identify access issues.
Use toolRobots.txt Generator
Build a correct robots.txt from presets for WordPress, ecommerce, and AI crawlers. Decide which bots to allow, add your sitemap, copy the file.
Use toolllms.txt Generator
Build a valid llms.txt from your own pages: the H1, blockquote summary and H2 link sections the proposal specifies, checked for relative URLs and duplicates.
Use toolHTTP Header Checker
Read every response header a URL returns, with the redirect chain timed hop by hop and X-Robots-Tag, header canonicals and caching gaps called out.
Use toolShopify robots.txt.liquid Generator
Build a robots.txt.liquid template that keeps Shopify's default rules in the Liquid loop and adds blocks for tag pages, vendor and type collections, filter parameters and AI crawlers.
Use toolShopify App Script Checker
Inventory every script tag on a Shopify product or collection page by origin: theme, Shopify platform, app and third-party. Flags async, defer and blocking scripts, sizes up to 30 external files and lists legacy ScriptTag API scripts.
Use toolRead up on internal and external links
A tool tells you what is wrong. These explain what to do about it.
Ahrefs Review 2026: Pricing, Features & Honest Verdict
Read guide10 Best Ahrefs Alternatives in 2026 (Compared by Use Case)
Read guideSurfer SEO vs Ahrefs 2026: Which SEO Tool Do You Actually Need?
Read guideTerms this tool checks
- Internal Linking
Internal linking is the practice of connecting pages within your website using hyperlinks.
- Link Equity
Link equity (also called link juice or PageRank) is the ranking value passed from one page to another through hyperlinks.
- Anchor Text
Anchor text is the visible, clickable text of a hyperlink.
- 301 Redirect
A 301 redirect is a permanent server-side redirect that tells search engines a page has permanently moved to a new URL.
One page checked, and the other nine hundred
A single page's links are a keyhole. CrawlRaven crawls the whole site, finds the orphan pages no internal link reaches and the pages buried five clicks deep, and ranks every broken link by the impressions and sessions behind the page it sits on, so you fix the ones that cost you something first.