Canonical URL setup in 1C-Bitrix: eliminate duplicates in 2-8h

In an online store on 1C-Bitrix, the same product can be accessible via a dozen URLs: through different catalog sections, search results, with sorting and filter parameters. Without the `rel="canonical"` tag, search engines waste crawl budget on **duplicate content**, and ranking power is diluted ac

Our competencies:

Frequently Asked Questions

In an online store on 1C-Bitrix, the same product can be accessible via a dozen URLs: through different catalog sections, search results, with sorting and filter parameters. Without the rel="canonical" tag, search engines waste crawl budget on duplicate content, and ranking power is diluted across all copies. According to Google Search Central, canonical URL is the only reliable way to indicate the preferred address. We set it up turnkey: analyze the project in one day, implement the solution in 2–8 hours, and guarantee the result. In 8 years of work, we have completed over 200 projects for Bitrix SEO optimization. Losses from duplicates can reach 30% of the SEO budget, and savings after canonical setup—up to 30% of the promotion budget.

Where duplicate URLs arise in Bitrix

  • A product is accessible from multiple catalog sections (infoblock with multiple section bindings).
  • Pages with GET parameters: /catalog/?sort=price&order=asc and /catalog/.
  • Smart filter pages without SEF: /catalog/?arrFilter_P1=100&set_filter=Y.
  • HTTP and HTTPS versions.
  • With www and without www.
  • Trailing /index.php.
  • Session parameters (sessid, BITRIX_SM_...) in URLs.

Over 60% of Bitrix sites have at least one type of duplicate. Eliminating this problem is the foundation for healthy SEO.

Comparison of canonical setup approaches

Method Flexibility Complexity Time to implement
Via component template High (per page type) Medium 2–4 hours per catalog
Global init.php Low (single logic) Low 30 min + tests
Custom handler with exceptions Maximum High 4–8 hours

Setting canonical via init.php is faster but less flexible—suitable for simple sites. For catalogs with filters and multiple sections, it's better to use the component template plus exception logic.

How to set canonical for product card?

Standard Bitrix components (bitrix:catalog.element, bitrix:catalog.section) do not have built-in canonical tag output. You need to add it in the component template.

In the product card template.php:

// Получить канонический URL элемента $canonicalUrl = $APPLICATION->GetCurDir() . CIBlockElement::GetDetailPageUrl( $arResult['IBLOCK']['DETAIL_PAGE_URL'], $arResult ); // Вывести в HEAD через AddHeadString $APPLICATION->AddHeadString( '<link rel="canonical" href="https://site.ru' . htmlspecialchars($canonicalUrl) . '" />', true ); 

Important: the URL must be absolute and without unnecessary parameters. If a product is linked to multiple sections, choose the main section via infoblock settings.

Case example: for a catalog of 5000 products with multiple section binding, we implemented canonical via component template in 4 hours. After setup, indexing of unique pages increased by 35%.

What to do with pagination pages?

Pages like /catalog/?PAGEN_1=2 are a point of debate. Options:

  • Canonical to the first page (aggressive, loses link equity).
  • No canonical, but use rel="prev" / rel="next" (outdated, Google ignores).
  • Unique canonical for each pagination page (recommended if content is unique per page).

We recommend the third option. It preserves page weight and correctly indexes all products. For a catalog with 10 pagination pages, this increased traffic by 20% according to Yandex.Metrica data.

Canonical for filter pages

Smart filter pages with non-empty parameters should point canonical to the base section page or to the SEF filter URL (if SEF is used for filter).

In the smart filter or section component template:

$isFiltered = !empty($_REQUEST['set_filter']) || !empty($_REQUEST['arrFilter_P1']); if ($isFiltered) { $canonicalUrl = $APPLICATION->GetCurPage(); // only path without GET parameters $APPLICATION->AddHeadString('<link rel="canonical" href="https://site.ru' . $canonicalUrl . '" />'); } 

Global canonical setup via init.php

For centralized canonical without modifying each template:

// /local/php_interface/init.php AddEventHandler('main', 'OnEndBufferContent', function(&$content) { global $APPLICATION; $canonical = 'https://site.ru' . $APPLICATION->GetCurPage(); $tag = '<link rel="canonical" href="' . htmlspecialchars($canonical) . '" />'; $content = str_replace('</head>', $tag . '</head>', $content); }); 

This approach is coarse—suitable for simple sites. For catalogs with filters, exception logic is needed.

What the work includes

Stage Description
Analysis Audit current state: detect duplicates, check meta tags, identify problem pages
Design Choose canonical strategy for each page type (product cards, sections, filters, pagination)
Implementation Implement via component template or init.php, write handlers
Testing Verify all duplicate types, correct canonical output
Deployment & monitoring Push to production, monitor indexing

Additionally: documentation of settings, CMS access, consultation on related SEO issues.

Timelines and pricing

Setting canonical for product cards and catalog sections takes 2–4 hours. Full implementation with filter pages, pagination, and custom URLs takes 4–8 hours. Pricing is calculated individually based on catalog size and logic complexity. Contact us for a preliminary assessment—we offer a free consultation. Get healthy indexing today.

Importance of correct canonical setup

Without a proper canonical, search engines waste crawl budget on duplicates instead of unique content. The result is ranking drops and poor indexing. Our turnkey setup ensures Google and Yandex see only the correct URLs. We use modern approaches described in the official Wikipedia article and 1C-Bitrix documentation. Request a consultation and start improving your site's SEO.