Akurat o ładowanie klas to bym się mało martwił

I tak większość FW ładuje przy byle drobiazgach tyle klas, że głowa boli. Jedna w tę czy tamtą to żadna różnica.
Co do canonical to jest to z tego co kojarzę wynalazek google, więc z nim na bank będzie działać, ale już inne wyszukiwarki niekoniecznie muszą go respektować i stąd pewnie te różne opinie. Co do domen to szczerze mówiąc zawsze podpinam narzędzia webmastera. Czemu? Bo nigdy nie wiesz czy domena aby nie była już w użyciu i coś nie jest pod nią zaindeksowane mimo wszystko. W ten sposób można na starcie albo mieć przewalone do odkręcania rzeczy (ban w przeglądarce po jakimś black-SEO), albo raj na ziemi (porobić 301 na już zaindeksowane url i przejąć ich siłę). Akurat to ostatnie to na dniach będę robił, bo szef wykupił jedną używaną domenę i już przeglądaliśmy jakie linki możemy "przejąć"

Jeśli tak Ci zależy na tej zgodności to stwórz sobie "ścieżki", które określą Ci poprawną kolejność parametrów. Jeśli masz tak, że parametry są zawsze w określonej i niezmiennej (par1, par2, par3, par4) niezależnie od braku lub obecności jakiegoś to problem jest prosty, gdyż tylko ustawiasz według niej i koniec. Gorzej gdy konieczne jest trzymanie się nie tak znów oczywistych schematów, a więc par 3 może wystąpić tylko jeśli poprzedza go par2, a par4 może wystąpić po par2 lub po par3, ale nie po par1, choć może jednakże wystąpić samodzielnie. W takich przypadkach musisz kombinować jak
szybko określić, które z parametrów są na podpuchę i z jakich możesz utworzyć realne ścieżki. Ja podam Ci taki, który teraz mi przyszedł do głowy jako możliwa implementacja:
1) wybieramy system binarny bo z niego ładnie maseczki zrobimy dla bitowych funkcji Boole'a
2) w schematach możliwych kombinacji określonemu parametrowi przypisujemy zawsze tę samą pozycję co utworzy nam wiele masek. Te wzorce w postaci masek możemy na sztywno zapisać gdzieś, by nie przeliczać za każdym razem.
3) z parametrów otrzymanych przez żądanie robimy w identyczny sposób jego schemat,
4) używamy funkcji AND dla każdej pary schemat+wzorzec. Jeśli wynik tej funkcji
pokrywa się z maską wzorca z punktu 2) to mamy pełne trafienie.
W wyniku przejścia przez wszystkie maski możemy otrzymać wiele trafień. Dlatego dla optymalizacji wygodnie uszeregować maski z 2) od razu w kolejności od najbardziej oczekiwanej do najmniej, czyli zapewne od tej mającej najwięcej parametrów występujących do tych mających najmniej.
Przykład:
Przewiduję 4 parametry w kolejności: państwo, miasto, ulica, strona_paginacji, a więc wzorzec ABCD i stosuje system dwójkowy
Ustalam, że ich ważność i wzorce to: ABD(1101), BCD(0111), ACD(1011) , AB(1100), BC(0110), BD(0101) , CD(0011), AD(1001), B(0100), A(1000), C(0010)
Dostałem z żądania państwo, miasto i ulicę, czyli A, B i C, więc mam wzorzec 1110. Teraz po kolei jadę funkcją AND po znanych mi wzorcach:
1101 & 1110 = 1100 => nie to
0111 & 1110 = 0110 => nie to
1011 & 1110 = 1010 => nie to
1100 & 1110 =
1100 => trafiony!
Wiem dzięki temu gdzie przekierować, bo odczytam prosto, że to AB. Tak więc państwo, miasto tylko mi były potrzebne, zaś ulica była zbędna.
To jedna z możliwych implementacji poprawności i jest ich ogrom, zależny od pomysłowości piszącego

Myślę, że sam wymyślisz własne rozwiązanie.
Mogłem też olać hierarchię i przepuścić funkcję AND przez wszystkie wzorce, nawet losowo, ale zapisać czy wzorzec trafił czy nie. Wygrałby w tym wariancie przykładowo wzorzec z najwyższą wartością. Dobra metoda gdy mamy możliwość pracy z systemem wieloprocesorowym bo zrównoleglamy zadanie. Zróbcie sprawdzenie na 4 prockach to każdy dostanie po 3 kombinacje do sprawdzenia. Jeśli kombinacji są dziesiątki, to sekwencyjne sprawdzanie ma dużą szansę wykonać się wolniej. Zwłaszcza z mniej popularną kombinacją.