How to Diagnose and Fix Crawl Traps
On this page
- The mechanism: how a few parameters become millions of URLs
- Diagnosis lives in the logs, not in intuition
- The decisive split: user functionality versus crawlable surface
- Right tool per layer
- The ordering trap that traps the people fixing traps
- Frequently Asked Questions
- Should I use the URL Parameters tool to handle this?
- Will robots.txt remove pages that are already indexed?
- How do I tell a real crawl trap from a large but legitimate site?
- Sources
- Related posts:
A crawl trap is a URL-generation pattern that mints effectively infinite low-value URLs: calendars that page forward forever, session IDs appended to every link, faceted filters that combine into millions of permutations, crawlable internal search results. Because Googlebot spends finite crawl on whatever it can reach, a trap starves the pages you actually want indexed by drowning them in pages no one should ever see. The cure is to separate what users can do from what Googlebot can reach. Keep the functionality, cut the crawl paths, and use the right tool at each layer rather than reaching for one blunt directive.
This is the over-generation problem specifically: Googlebot is drowning in URLs your site creates. It is distinct from deciding which faceted filter combinations deserve indexable landing pages, from the economics of crawl budget on a large site, and from the orphan problem of pages with too few paths. Here the site has too many paths, and the question is which generator is producing them.
The mechanism: how a few parameters become millions of URLs
Independent combinable parameters multiply. Suppose a category page accepts filters for color, size, brand, price band, and sort order, and each can be combined freely. If color has 10 values, size 6, brand 20, price 5, and sort 4, that single category can express 10 times 6 times 20 times 5 times 4, which is 24,000 distinct URLs, all rendering trivial variations of the same product set. (Those numbers are illustrative; the point is the arithmetic, not any specific catalog.) Add pagination inside each combination and the count grows again.
Calendars and session IDs are worse because they are unbounded. A booking calendar with a “next month” link Googlebot can follow generates new URLs into infinity, since there is always a next month. A session ID stamped into the URL means every crawl of every page produces a brand-new address for content Googlebot already has. These are not large numbers; they are uncapped ones, which is why a single calendar widget can consume more crawl than an entire product catalog.
Diagnosis lives in the logs, not in intuition
Two evidence sources tell you which generator is the problem. Start with the Crawl Stats report in Search Console (Settings, then Crawl stats) to see the overall request volume, the host status, and the breakdown by response and by file type. A trap usually shows up as a request count wildly out of proportion to your real page count, or a rising trend with no corresponding content growth.
Then go to the server logs, because that is where the answer actually is. Filter to the verified Googlebot user agent, then group requests by URL pattern with the variable values stripped out, so that /category?color=red&size=9 and /category?color=blue&size=11 collapse into one bucket like /category?color=&size=. Now you can read the share of crawl going to parameter URLs versus clean canonical URLs, and the status-code mix within each pattern. When 80 percent of Googlebot’s requests land on one parameterized pattern that maps to a handful of real pages, you have found the generator. Intuition will not show you this; the grouped log will.
The decisive split: user functionality versus crawlable surface
The fix that eliminates a trap at the source is to stop minting the URL in the first place. Filtering, sorting, and in-page search are user actions; they do not have to produce a new crawlable address. A filter implemented so that it changes client-side state, or updates the view without generating a unique server-rendered URL with an href link, gives the user the full experience while giving Googlebot nothing new to crawl. The functionality survives; the infinite surface does not.
Contrast that with the after-the-fact approach, where you generate the URL and then try to tell Google to ignore it. Every such directive still costs a crawl, because Google has to fetch the URL to read the instruction. The principle to carry into every decision below: stop creating the URL beats managing the URL after you have created it.
Right tool per layer
Each tool does one job, and using the wrong one is how traps get worse instead of better:
| Tool | What it does | When to use it |
|---|---|---|
| robots.txt disallow | Prevents crawling of the pattern; does not reliably prevent indexing | Worthless patterns you never want fetched (internal search, infinite calendars), where no equity needs consolidating |
| rel=canonical | A hint to consolidate signals onto the clean URL; the variant is still crawled | Parameter URLs that must exist for users but should fold into one canonical page |
| noindex | Allows crawl, prevents indexing | A URL that must be crawlable but must not appear in results |
| JS-only state | No crawlable URL is minted at all | The structural fix: filters and search that change the view without generating addresses |
The conflict to internalize: noindex requires Google to crawl the page to see the tag, so a URL that is both blocked in robots.txt and carries a noindex will never have its noindex read. The two directives cancel each other.
The ordering trap that traps the people fixing traps
Here is the mistake that turns a one-step fix into a permanent mess. You discover thousands of trap URLs are already indexed, so you add a robots.txt disallow to stop them. The indexed URLs do not go away. Google can no longer crawl them, which means it can never see a noindex you might add, and a URL it already knows about can linger in the index, sometimes surfacing as a bare URL with no snippet because Google was told not to fetch it.
To actually deindex already-indexed trap URLs, reverse the order. First allow crawling and apply noindex to the pattern. Let Google recrawl and process the noindex over time, watching the indexed count for that pattern fall. Only after they have dropped out should you add the robots.txt block to prevent future crawling. If you need them gone faster for an urgent case, the Removals tool gives a temporary delisting (it expires after roughly six months and is not a permanent fix), but the durable solution is still allow-crawl-plus-noindex, then block.
Internal search results and infinite calendars are the two patterns that should almost never be crawlable at all. Block the pattern in robots.txt if nothing is indexed yet, or make them JS-only so no address is ever generated. There is no legitimate reason for Googlebot to be paging through your calendar to the year 2099.
Frequently Asked Questions
Should I use the URL Parameters tool to handle this?
No. That Search Console tool was retired in 2022 and no longer exists. Handle parameters with canonical tags, robots.txt, or by not generating the URLs, and diagnose the patterns in Crawl Stats and your server logs.
Will robots.txt remove pages that are already indexed?
No, and assuming it will is the most common self-inflicted trap. robots.txt blocks crawling, not indexing; a URL already in the index can stay there, and blocking it prevents Google from ever recrawling to see a noindex. Allow crawl plus noindex first, let it process, then block.
How do I tell a real crawl trap from a large but legitimate site?
Group Googlebot’s requests by URL pattern in your logs. A legitimate large site spreads crawl across many real pages; a trap concentrates a disproportionate share of crawl on one parameterized or unbounded pattern that maps to very few unique pages.
Sources
Google Search Central, Introduction to robots.txt: https://developers.google.com/search/docs/crawling-indexing/robots/intro
Google Search Central, Block Search indexing with noindex: https://developers.google.com/search/docs/crawling-indexing/block-indexing
Google Search Central, Crawl Stats report: https://support.google.com/webmasters/answer/9679690