Has a Link with an Empty Href Attribute: How to Fix It

No Comments
Has a link with an empty href attribute: how to fix it

What an empty href flags, and why it matters

This check fires on any anchor where the href attribute is present but blank — <a href=""> or an href holding nothing but spaces. Per the HTML spec an empty href resolves to the current document, so every one of these anchors is a link that reloads the page it sits on: dead weight for users, a wasted line in your link graph for crawlers, and a broken promise to screen readers.

The stakes are rarely one stray link. Empty hrefs come from templates and JavaScript patterns that repeat across a whole site, so a single bad loop can stamp hundreds of self-links onto your pages, muddying the internal structure that Google actually uses to prioritise what to crawl and rank.

A real failing example, and the fix

Here is the pattern that trips the check most often — an anchor built as a JavaScript hook with the href left empty so the page does not jump:

<!-- Fails the check: empty href resolves to the current URL -->
<a href="">Filter results</a>

<!-- Also fails: whitespace-only href is treated as empty -->
<a href="   ">Load more</a>

If the element genuinely navigates, give it a real destination. If it only triggers an action (opening a menu, filtering a list, submitting), it was never a link — use a button:

<!-- Navigates somewhere real -->
<a href="/products/filtered/?sort=price">Filter results</a>

<!-- Performs an action, so it is a button, not a link -->
<button type="button" class="load-more">Load more</button>

The button keeps your existing click handler working while removing the phantom self-link from the crawl entirely. If you cannot change the markup type quickly, at minimum point the href at the real target URL so the fallback still lands somewhere useful.

Empty href vs. the alternatives, at a glance

MarkupWhere the click goesCrawlable link?Correct use
<a href="">Reloads the current URLNo target — self-linkNever
<a href="#">Jumps to top of pageNo real targetOnly a true "back to top" anchor
<a href="/real/url/">The destination pageYesNavigation
<button type="button">Fires a script actionNot a link, by designInteractive controls

How to detect it

  1. Screaming Frog. Crawl the site, then use Bulk Export → Links → All Outlinks and filter the Destination column for values equal to the page's own URL, or sort for blank anchors. The Outlinks tab on any URL shows self-referencing links immediately.
  2. View source or DevTools. Open the page source and search for href="" and href="#". In Chrome DevTools, run document.querySelectorAll('a[href=""]').length in the Console to count them on the rendered page.
  3. Command line spot check. Pull the raw HTML and grep for the pattern: curl -s https://example.com/page/ | grep -oE '<a href="[[:space:]]*"'. A non-empty result means the check will fire.
  4. Google Search Console. Empty hrefs will not appear as crawl errors, but if a templating bug is generating them at scale you may see inflated Discovered – currently not indexed counts as crawlers chew through self-referencing noise. Use the URL Inspection tool to confirm which links Google actually extracted.

How to fix it

  1. Find the source. Almost every empty href traces back to one template partial, component, or JS snippet — fix the source and the whole cluster clears at once.
  2. Decide navigation or action for each anchor. Navigation gets a real URL; actions become <button> elements.
  3. Patch the template. Where a URL field can be empty, guard the loop so it either outputs a real link or renders plain text — never href="".
  4. Re-crawl and confirm the self-links are gone from the outlinks export, then check that no accessibility warnings remain in Lighthouse.

FAQ

Is href="#" any better than an empty href?

Marginally, but it is still not a real link. # jumps to the top of the page and leaves a junk history entry. Reserve it for a genuine top-of-page anchor and use a button everywhere else.

Does an empty href actually hurt rankings?

Not directly and not dramatically, but self-links waste the internal equity you could be steering toward pages that need ranking support, and at scale they add crawl noise. It is a hygiene problem worth clearing, not a penalty.

Why does my page builder keep generating them?

Page builders and themes loop over records and write href="{{ url }}". When a record's URL field is empty, the attribute renders as an empty string. Add a conditional in the template so the link only prints when a URL exists.

Can JavaScript "fix" the empty href at runtime?

A script can set the href after load, but crawlers and assistive tech may read the markup before that runs, and you are still using the wrong element for an action. Ship the correct markup instead of patching it client-side.

Should I nofollow these instead of removing them?

No. Nofollow does not make a destination-less link useful — it just adds an attribute to something that should not exist. Remove the anchor or give it a real target.

Related checks and reading

Claude Vincent is a technical SEO consultant focused on crawlability, rendering, and AI-search visibility. He writes the field guides and case studies at SEO ProCheck, with a bias toward the durable, unglamorous work that decides whether search engines and AI answer engines can actually read and cite a site.

About SEO ProCheck

Technical SEO consulting and GEO strategy with 20 years of enterprise experience. Case studies, resources, and tools for search and AI visibility.

Work With Me

Technical SEO audits, GEO strategy, site migrations, and international SEO. Hourly consulting for teams who need hands-on support, not just reports.

Subscribe to our newsletter!

More from our blog