---
title: "Magento Layered Navigation SEO: Fix Index Bloat"
url: https://encited.com/blog/magento-layered-navigation-seo
description: "Magento layered navigation SEO: the filter and toolbar parameters behind index bloat, when to use canonical, noindex or robots.txt, and which filters get a page"
lang: en
---

Image: Magento Layered Navigation SEO: How to Stop Filter URLs Causing Index Bloat (https://encited.com/blog/thumbnails/magento-layered-navigation-seo.webp)

# Magento Layered Navigation SEO: How to Stop Filter URLs Causing Index Bloat

Oct 29, 2026 October 29, 2026 · by Aki from Encited

Magento layered navigation SEO: the filter and toolbar parameters behind index bloat, when to use canonical, noindex or robots.txt, and which filters get a page

**TL;DR.** Magento 2 writes every layered navigation filter and every toolbar control into the URL as a query parameter, so one category exposes thousands of crawlable URLs that share one title. Find the damage in Search Console's Page indexing report. Block the toolbar parameters and the filters nobody searches for in robots.txt, use noindex only to clear filter URLs that are already indexed, and never apply both to one URL. Give the few filters people do search for a real page. Then confirm with a crawl and the crawl log that Googlebot has stopped requesting the parameters.

Layered navigation is Magento's name for the filter block on category and search pages. Each filter a shopper clicks goes into the URL, and so does each sort order, page size and view mode. Magento layered navigation SEO is the work of deciding which of those URLs Google may crawl, which it may index, and which few deserve a page of their own. Skip it and you get Magento index bloat: an indexed URL count many times the size of the catalog, and Googlebot spending its visits on sort orders while new products wait. The method for any platform is in faceted navigation SEO (https://encited.com/blog/faceted-navigation-seo), and the robots.txt rules live in the Magento SEO (https://encited.com/blog/magento-seo#magento-seo-and-layered-navigation) pillar.

## Why Magento layered navigation creates so many URLs

Every filterable attribute becomes its own query parameter, named with the attribute code and set to an option ID, so a shopper's choice of red shows up as `?color=50`. The number means nothing to a search engine. The product list toolbar adds four parameters, and pagination a fifth:

| Parameter | Where it comes from | Example |
| --- | --- | --- |
| `<attribute_code>=` | Each attribute with Use in Layered Navigation set to a filterable value | `?color=50`, `?size=167` |
| `price=` | The price attribute; ranges come from Price Navigation Step Calculation | `?price=20-30` |
| `product_list_order=` | The toolbar's sort field | `?product_list_order=price` |
| `product_list_dir=` | The sort direction | `?product_list_dir=desc` |
| `product_list_limit=` | Products per page, from the allowed values in the admin | `?product_list_limit=36` |
| `product_list_mode=` | Grid or list view | `?product_list_mode=list` |
| `p=` | Pagination | `?p=2` |

Magento appends each new filter to the current query string, so `?color=50&size=167` and `?size=167&color=50` are two URLs for one product list. Every one of those URLs carries the category's title, meta description and robots meta tag, which is `INDEX, FOLLOW` by default. Google's faceted navigation guidance (https://developers.google.com/crawling/docs/faceted-navigation) says a setup like this "can generate infinite URL spaces which harms the website", because crawlers have to fetch the URLs to find out they are useless. On Magento each fetch is a cache miss, and PHP builds the page from scratch.

## How to find Magento index bloat in Search Console

Open Indexing, then Pages, and put the indexed count next to the number of enabled, visible products and categories in your admin; the gap is the bloat. Then read the reasons, because each one maps to a state your layered navigation is in:

| Page indexing reason | What it means on a Magento store |
| --- | --- |
| Indexed pages with `?` in the URL (under "View data about indexed pages", filter "Unsubmitted pages only") | Filter or toolbar URLs are in the index now. Cleanup needs noindex before any robots.txt rule. |
| Duplicate without user-selected canonical | Category canonical tags are off. |
| Alternate page with proper canonical tag | Canonicals work, and Google still crawls every variant to read them. |
| Excluded by 'noindex' tag | An extension or theme sets noindex on filter pages. Fine during cleanup. |
| Indexed, though blocked by robots.txt | A URL was blocked while still indexed or still linked. The robots.txt and noindex conflict shows up here. |

For a second view, search Google for `site:yourstore.com inurl:product_list_order` and `site:yourstore.com inurl:color=`. The counts are estimates; the URLs on the first pages are real.

A crawl from the outside shows which filter URLs your own pages link to, which is where Googlebot finds them. The site audit (https://encited.com/site-audit) crawls the store the way a bot does and groups what it finds: clusters of pages sharing one title under a single category, canonical tags pointing at another URL, and internal links to URLs your robots.txt blocks. Note the number of crawlable URLs it reaches; it is the baseline for the check at the end.

## Canonical, noindex or robots.txt for Magento filter URLs?

Use robots.txt for the parameters nobody searches for, use noindex only to clear filter URLs that are already indexed, and keep the category canonical on as a backstop. Never put a robots.txt block and a noindex on the same URL.

**Canonical.** With "Use Canonical Link Meta Tag For Categories" set to Yes, Magento writes the plain category URL as the canonical on every filtered, sorted and paginated view. Google's faceted navigation guidance says this "may, over time, decrease the crawl volume of non-canonical versions of those URLs". Keep it on, and know its limit: Google has to crawl the URL to read it. Check `?p=2` too: Google's pagination guide (https://developers.google.com/search/docs/specialty/ecommerce/pagination-and-incremental-page-loading) asks each page in a sequence to point its canonical at itself.

**noindex.** Native Magento has one robots meta tag per website or store view, under Content > Design > Configuration in the Search Engine Robots section. Nothing in the admin applies noindex to filtered pages only, so it takes theme code or one of the suites compared in Magento 2 SEO extensions (https://encited.com/blog/magento-2-seo-extensions). Google's crawl budget guide (https://developers.google.com/crawling/docs/crawl-budget): "Don't use noindex, as Google will still request, but then drop the page". So use it for cleanup only: set `NOINDEX, FOLLOW` on the filter URLs that are indexed today, leave them crawlable, wait until they leave the indexed list, then add the robots.txt rules.

**robots.txt.** Google's first recommendation for filters you don't want in search: "Oftentimes there's no good reason to allow crawling of filtered items". Block the four `product_list_` parameters, `price=`, `size=` and every other attribute code without search demand, under `User-agent: *` so AI crawlers follow the rules too. Keep `?p=` and the unfiltered category crawlable, and skip Adobe's "Reset To Defaults" rules, which include `Disallow: /*?` and block pagination.

**The conflict.** The Magento setup that goes wrong most often has an SEO extension writing `NOINDEX, FOLLOW` on filter pages while robots.txt blocks the same parameters. Google's noindex documentation: "If the page is blocked by a robots.txt file or the crawler can't access the page, the crawler will never see the noindex rule". The blocked URLs stay indexed. Pick one control per URL, and test each noindex URL against the robots.txt analyzer (https://encited.com/free-tools/robots-txt-analyzer), which reads your live file the way Googlebot, GPTBot and ClaudeBot do.

## Which filters deserve a landing page, and how to build one in Magento

A filter earns a page when shoppers search for the attribute together with the category, as in "red dresses" or "leather boots", and you have enough products to fill a grid. Brand, color and material often clear that bar. Size, price range, sort order and page size never do. Search Console's Performance report answers it for your store: filter by a category page and read the queries that contain an attribute word.

`?color=50` cannot be that page: it carries no word, shares the category's title and has no copy of its own. There are three ways to build one.

**A subcategory.** Under Catalog > Categories, add a child under the category, give it the URL key `red-dresses`, write its Meta Title and Meta Description in the Search Engine Optimization section, add an intro in the Content section, and assign the products. The page gets a self-referencing canonical, a breadcrumb, a sitemap entry and a menu link. In Magento Open Source the product assignment is by hand; Adobe Commerce's Visual Merchandiser can assign products by attribute rule.

**A CMS page.** Under Content > Elements > Pages > Add New Page, give the page a title, a URL key and its own Meta Title and Meta Description, as in Adobe's page guide (https://experienceleague.adobe.com/en/docs/commerce-admin/content-design/elements/pages/page-add). Fill the body with copy and a Catalog Products List widget whose condition selects the attribute value, so the grid updates itself. The page sits outside the category tree and breadcrumb, so it suits buying guides and seasonal pages more than a core attribute page.

**An extension's landing page feature.** Layered navigation extensions rewrite a chosen filter to a readable path, give it its own title, H1, description and canonical, add it to the sitemap, and apply noindex rules to every other combination. Set to rewrite every filter value, an extension turns opaque bloat into readable bloat, so use its allowlist. Which suites include it is in Magento 2 SEO extensions (https://encited.com/blog/magento-2-seo-extensions).

Whichever you pick, link to the page with a plain `<a href>` from the parent category, and check that no robots.txt rule matches it: `Disallow: /*color` blocks `/dresses/color-red.html` as well as `?color=50`.

## The Magento admin settings that control layered navigation URLs

Two admin screens decide how many filter URLs a category can produce: the attribute's Storefront Properties and the Storefront section of the catalog configuration. Both are in Adobe's layered navigation guide (https://experienceleague.adobe.com/en/docs/commerce-admin/catalog/catalog/navigation/navigation-layered) and its catalog configuration reference (https://experienceleague.adobe.com/en/docs/commerce-admin/config/catalog/catalog).

**Per attribute.** Go to Stores > Attributes > Product, open the attribute, and choose Storefront Properties. "Use in Layered Navigation" has three values. No keeps the attribute out of the filters. For "Filterable (with results)", Adobe says "Layered navigation includes only those filters for which matching products can be found." For "Filterable (no results)", it says "Layered navigation displays filters for all available attribute values and their product counts", so values with zero products get linked, and each link is an empty page with a 200 status where Google asks for a 404 (https://developers.google.com/crawling/docs/faceted-navigation). Set every attribute shoppers don't filter by to No, because each filterable attribute adds a parameter to every anchor category at once. "Use in Search Results Layered Navigation" adds the attribute's filters to `/catalogsearch/`, so block that path in robots.txt either way.

**Per category.** Under Catalog > Categories, open Display Settings. Adobe: "Layered navigation is available only for anchor categories." A category with Anchor set to No produces no filter URLs, and also stops showing products from its subcategories, so this is a merchandising decision first.

**Storefront section.** Go to Stores > Settings > Configuration, expand Catalog, choose Catalog, and open Storefront. "List Mode" set to Grid Only removes the grid and list toggle, and with it the `product_list_mode` links. "Products per Page on Grid Allowed Values" is the list of `product_list_limit` values, so every value you add is a URL per category. "Allow All Products per Page" adds `product_list_limit=all`; leave it at No. "Product Listing Sort by" decides the `product_list_order` values. Fewer options mean fewer URLs; the toolbar still links the options that remain, so the robots.txt rules stay. In the Layered Navigation section of the same page, "Price Navigation Step Calculation" set to Manual fixes the price ranges; the two automatic methods compute them from the catalog, so the `price=` URLs change as prices change.

In the Search Engine Optimization section, "Use Canonical Link Meta Tag For Categories" goes to Yes. Adobe's description: the option "uses a canonical meta tag to identify the category URL that search engines should index."

## How to confirm the fix with a crawl and the crawl log

The same day, after a cache flush, view the source of four URLs: the plain category, `?color=50`, `?product_list_order=price` and `?p=2`. Each should carry one canonical tag pointing where you intend and the robots meta tag you expect; a filtered URL you blocked should fail in the robots.txt analyzer and a paginated one should pass. Then recrawl the store with the site audit and compare the reachable URL count with your baseline. Duplicate title clusters under a category should collapse to the category and its landing pages, and the list of internal links to blocked URLs should be empty.

Over the following weeks, the crawl log tells you whether Googlebot took the hint. If your store runs through Encited, the crawl log (https://encited.com/docs/crawl-logs/read-your-crawl-log) lists each request from Googlebot, Bingbot and the AI crawlers with the full URL, query string included, the status code and what the bot got back. Filter by Googlebot and read the share of requests that carry `product_list_` or an attribute parameter. It should fall as the robots.txt rules take effect. For the landing pages you built, Index Rush (https://encited.com/get-indexed-faster) shows the index status of each URL and requests indexing when one sits in "Discovered - currently not indexed".

In Search Console, "Blocked by robots.txt" grows, the indexed `?` URLs shrink, and the landing pages appear in the indexed list. If a `site:` search still returns toolbar URLs a month in, a link to them exists somewhere, and the crawl shows you where.

## FAQ

**How do I fix index bloat from layered navigation in Magento 2?** Turn on canonical tags for categories, set the attributes shoppers don't filter by to No in Use in Layered Navigation, and block the toolbar parameters and the remaining low-value filters in robots.txt. If filter URLs are already indexed, apply noindex first, keep them crawlable until they leave the index, then add the robots.txt rules.

**Should I noindex Magento layered navigation pages?** Only as a cleanup step for filter URLs that are indexed now. Google still has to crawl a page to read the noindex. Once the URLs have dropped out, switch to a robots.txt block. Never run both on the same URL.

**Should I disable layered navigation for SEO?** No. Shoppers need the filters. Cut the filterable attributes to the ones shoppers use, avoid "Filterable (no results)", trim the toolbar options, and block the rest in robots.txt.

**Can a Magento filter page rank without an extension?** Yes, as a subcategory or a CMS page with a Catalog Products List widget. What native Magento cannot do is turn `?color=50` itself into a ranking page or apply noindex to the other filter URLs; those two jobs need an extension or theme code.

**What is the best URL structure for Magento filter landing pages?** A readable path under the category, such as `/dresses/red-dresses.html` for a subcategory, or the path an extension writes for a chosen filter. One URL per page, a self-referencing canonical, no query parameters. Every other filter keeps the parameter form, so robots.txt can block it without touching the pages that rank.

Image: Google (https://encited.com/crawler-logos/google-search.svg)

Image: Gemini (https://encited.com/crawler-logos/gemini.png)

Image: ChatGPT (https://encited.com/crawler-logos/chatgpt.svg)

Image: Claude (https://encited.com/crawler-logos/claude.svg)

Image: Grok (https://encited.com/crawler-logos/xai.svg)

Image: Meta (https://encited.com/crawler-logos/meta.svg)

Image: Perplexity (https://encited.com/crawler-logos/perplexity.png)

## Get your store ranked in AI

See how ChatGPT, Gemini, Claude and Perplexity recommend your products and which stores they pick instead.

Talk to sales: https://encited.com/contact-sales

Image: Avatar (https://replymaven.com/api/uploads/Su6Q0nK63iZW0ZFJBRNWpmRuppVDLuab/98df5262-f992-45fa-a750-00a6c919baf9.png)

How can we help?

Get instant answers to your questions or leave a message for an engineer will reach out

Ask AI about Encited

See our docs (https://lovablehtml.com/docs)

Contact support

Leave a message

We'll get back to you soon

Ask AI about Encited

Product questions, troubleshooting and

Thinking

Image: Preview

Drop an image to attach

Powered by ReplyMaven (https://replymaven.com/)

## Structured data

```json
[
  {
    "@context": "https://schema.org",
    "@type": "BreadcrumbList",
    "itemListElement": [
      {
        "@type": "ListItem",
        "position": 1,
        "name": "Home",
        "item": "https://encited.com/"
      },
      {
        "@type": "ListItem",
        "position": 2,
        "name": "Blog",
        "item": "https://encited.com/blog"
      },
      {
        "@type": "ListItem",
        "position": 3,
        "name": "Magento Layered Navigation SEO: How to Stop Filter URLs Causing Index Bloat",
        "item": "https://encited.com/blog/magento-layered-navigation-seo"
      }
    ]
  },
  {
    "@context": "https://schema.org",
    "@type": "Article",
    "headline": "Magento Layered Navigation SEO: How to Stop Filter URLs Causing Index Bloat",
    "description": "Magento layered navigation SEO: the filter and toolbar parameters behind index bloat, when to use canonical, noindex or robots.txt, and which filters get a page",
    "image": "https://encited.com/blog/thumbnails/magento-layered-navigation-seo.webp",
    "datePublished": "2026-10-29",
    "dateModified": "2026-10-29",
    "author": {
      "@type": "Person",
      "name": "Aki from Encited"
    },
    "publisher": {
      "@type": "Organization",
      "name": "Encited.com",
      "alternateName": "LovableHTML.com",
      "logo": {
        "@type": "ImageObject",
        "url": "https://encited.com/brand/logo.svg"
      }
    },
    "mainEntityOfPage": {
      "@type": "WebPage",
      "@id": "https://encited.com/blog/magento-layered-navigation-seo"
    }
  }
]
```