The /collections/*+* Filter URL Pattern, Explained
Shopify's default /robots.txt blocks /collections/*+* — the URL signature generated when a customer combines two filters on a collection page (e.g. /collections/dresses/red+xl)1. The pattern matches any URL where a + appears in the path after a collection handle, which is how Shopify's native filter system serializes multi-facet selections. The block exists to suppress combinatorial duplicate-content explosion. Almost no Shopify store should unblock it.
Published··Verified 2026-05-22·
§01The pattern
The /collections/*+* URL pattern
When a customer applies two or more filters on a Shopify collection page, the URL serializes the selection by concatenating filter values with a + character. A 'red xl dresses' selection becomes /collections/dresses/red+xl (or similar, depending on theme implementation). The * in /collections/*+* is a robots.txt wildcard matching any collection handle followed by any filter combination containing a + literal in the path.
Why combinatorial URLs are a problem: a single collection with 8 colors and 6 sizes has 8×6 = 48 single-facet pages, 8×7/2×6×5 = some-large-number two-facet combinations, and so on. Three-way combinations multiply further. Every URL is technically crawlable, all serve mostly-overlapping product subsets, and most have zero search demand. Google's faceted navigation guidance3 identifies this combinatorial explosion as a primary cause of wasted crawl budget on ecommerce sites.
§02Why blocked
Why Shopify blocks the pattern by default
The default block exists for three reasons. (1) Combinatorial explosion: a 10-filter collection generates thousands of URL combinations, most with no search demand. (2) Thin content: filter combination pages typically show subsets of the parent collection with no unique editorial content. (3) Crawl-budget waste: search engines spend crawls on filter combinations instead of canonical primary URLs. Shopify's default robots.txt block stops this at the platform level.
Shopify's Editing-robots-txt help page1 lists /collections/*+* as one of six default-blocked patterns alongside /admin, /cart, /checkout, /search, and /policies/. Each block exists for a reason; the /collections/*+* block is the one most operators forget exists.
One detail worth knowing: the block is robots.txt-level, which means Google still knows these URLs exist (it sees them in internal links) but won't crawl them. URLs blocked by robots.txt can still appear in search results as URL-only listings if heavily linked. In practice this rarely happens on a Shopify store because filter URLs aren't linked externally — they're only generated by customer interaction on the collection page itself.
§03Facets vs filters
Facets vs filters — what's blocked, what isn't
Single-facet selections on Shopify (e.g. /collections/dresses?filter.v.option.color=red) typically use query parameters rather than path segments, and the + multi-facet serialization is what triggers the robots.txt block. The distinction matters because single-facet URLs may still be crawlable depending on theme implementation, while multi-facet URLs are blocked at the platform level. Search & Discovery app filters can generate query-string URLs that bypass the path-level block, which is the next thing to audit.
The clean mental model: Shopify's default robots.txt only blocks the multi-facet path pattern. Query-string filters (?filter.v.color=red&filter.v.size=xl) are technically not blocked by the default and may need additional canonical or noindex handling depending on theme behaviour. Most modern Shopify themes auto-canonical filtered query-string URLs back to the bare collection, which solves the problem at the canonical layer rather than the robots.txt layer.
§04Search & Discovery
Search & Discovery app and filter URLs
The Shopify Search & Discovery app (Shopify's first-party filter/facet app) generates query-string filter URLs on collection pages. These URLs are not caught by the /collections/*+* path-level block because they use query parameters instead of path segments. The canonical handling depends on theme: most modern themes (Dawn-derived themes from 2023+) emit a canonical pointing back to the bare collection URL, which consolidates ranking signals without needing additional robots.txt edits.
Verify the behaviour on your store with one curl. If the canonical on a filtered URL points back to the bare collection, the platform is handling it correctly. If the canonical is self-referencing on the filtered URL, you have an extra audit step — the theme or app is treating each filter combination as a unique page, which can recreate the duplicate content surface the default block was supposed to eliminate.
bashAudit filtered URL canonical behaviour
# Expected: canonical points to bare /collections/dressescurl -sL "https://yourstore.com/collections/dresses?filter.v.option.color=red" \ | grep -i 'canonical'# Expected output:# <link rel="canonical" href="https://yourstore.com/collections/dresses">
§05When to unblock
When to unblock (almost never)
Unblocking /collections/*+* is the wrong move for ~99% of Shopify stores. The only legitimate use case: a niche store with high-intent multi-facet queries that need their own ranking targets (e.g. 'red wedding dresses size 8' is a real search query the store wants to rank for). In this case, you don't unblock the default — you create a hand-built static collection page at /collections/red-wedding-dresses-size-8 with curated content, structured navigation, and full editorial treatment. That's a named collection, not a filter URL.
The principle: every URL Google should rank for needs to be a real, curated, content-rich page — not an auto-generated filter combination. The default robots.txt block keeps the filter URLs out of the index, and the merchant builds named collections for the high-intent queries that justify dedicated pages. This is the standard ecommerce faceted-navigation strategy Google recommends in its faceted-navigation doc3.
For the broader robots.txt.liquid mechanics — the editable Liquid template that controls this block — see the robots.txt.liquid hub and the leaf on default rules.