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=ascand/catalog/. - Smart filter pages without SEF:
/catalog/?arrFilter_P1=100&set_filter=Y. - HTTP and HTTPS versions.
- With
wwwand withoutwww. - 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.

