Всё зависит от технической части, движка, фреймворка.
В простейшем случае текущий URL без домена и протокола находится в переменной
$_SERVER['REQUEST_URI']
Для
https://sayt.ru/catalog/1/page=2/
$_SERVER['REQUEST_URI'] = '/catalog/1/page=2/ ';
Для
https://sayt.ru/catalog/1/order=named/page=2/
$_SERVER['REQUEST_URI'] = '/catalog/1/order=named/page=2/ ';
То есть вашу проблему можно решить следующим образом: если мы видим в урл схему /catalog/ID/ то на основании этого формируем корректный канонический url.
Сделать это можно, например регулярным выражением.
Предполагается что в $rel_canonical мы получаем корректный url который далее вы выводите на странице.
<?php
$rel_canonical = '';
if(preg_match('!^/catalog/([0-9]+)!si', $_SERVER['REQUEST_URI'], $out))
{
$rel_canonical = "https://sayt.ru/catalog/{$out[1]}/";
}
//$rel_canonical выводим на странице