Если кратко — это стандартное поведение «urleditor» c пресетом «handy» при обработке путей к страницам с вложенностью более 2-х — он проверяет не весь путь полностью, а только начало и конец, и то только на наличие в структуре категорий, но не на вложенность. Т.е. если у нас структура примерно такая:
1
2
с1→с11→с111 → страница p1
\→с12→с121
То сработает любое:
с1/c11/c111/p1 с1/c111/p1
c111/p1
c12/c111/p1 с1/все/что/угодно/с/любой/вложенностью/c111/p1
Частично такой расклад компенсирует наличие на всех копиях единого `canonical url` в котором правильно указан полный путь.
Делаю сейчас свой модуль на основе page. Посмотрел какое отдаётся значение функциейcot_url_catpath(). В принципе, оно не влияет на проблему дублей, так как отдаёт строку из входящих параметров $c, $al, $id, а не из полного uri. Добавление дубля в пути при вызове не передаётся в функцию cot_url_catpath(), например такой тест:
Есть категория test, с подкатегорией test-one, сначала пробуем вызвать дубли:
/test/test-one - канонический
/test/test/test-one - дубль, но работает
/test/test/test/test-one - дубль, но работает
/test/test/test/test/test-one - дубль, но работает
/test/test/test/test/test/test-one - дубль, но работает
/test/test/test/test/test/test/test-one - дубль, но работает
/test/test/test/test/test/test/test/test-one - дубль, но работает
/test/test/test/test/test/test/test/test/test-one - дубль, но работает
Дальше не смотрел, но дубли бесконечные. При этом функция cot_url_catpath() выдаёт неизменное значение test/test-one, не реагируя на дубли!