Jestem po znormalizowanych/kanonicznych URLach dla SPA z serwerem ExpressJS.Standardowe adresy URL ExpressJS/kanoniczne adresy URL:
Mimo że kopia zapasowa SPA jest tworzona przez router po stronie serwera - szablony mogą się nieco różnić w przypadku adresów URL aplikacji. Jedną z różnic jest tag <link rel="canonical" href="https://example.com{{ originalPath }}">
. Nie istotne szczegóły, ale wyjaśnia kontekst pytania. Spodziewam się, że będzie tylko jeden adres URL, który odpowiada 200, jego odmiany są przekierowywane do niego za pomocą 301/302 (działa dla żywych ludzi i wyszukiwarek).
Chciałbym, aby adresy URL były rozróżniane i rozróżniane (bez dodatkowych slashów), podobnie jak w przypadku opcji Router
, ale niekanoniczne adresy URL (różniące się wielkością liter lub dodatkowym ukośnikiem) powinny powodować przekierowanie 301/302 do kanonicznego adresu URL zamiast 404.
W większości aplikacji po prostu chcę wymusić, aby adresy URL dla tras *
były małe (z wyjątkiem zapytań), bez dodatkowych ukośników. To znaczy. app.all('*', ...)
oraz przekierowania są:
/Foo/Bar/ -> /foo/bar
/foo/Bar?Baz -> /foo/bar?Baz
Ale mogą być wyjątki, gdy trasy są określone jednoznacznie. Na przykład, istnieją wielbłądziej obudowane trasy:
possiblyNestedRouter.route('/somePath')...
possiblyNestedRouter.route('/anotherPath/:Param')...
I wszystkie adresy niekanonicznych powinien zostać przekierowany do kanonicznej (przypadek parametr pozostaje nienaruszona):
/somepath/ -> /somePath
/anotherpath/FOO -> /anotherPath/FOO
Logika kanonicznych adresów URL jest dość proste, więc to dziwne, że nie mogłem znaleźć niczego na ten temat odnośnie ExpressJS.
Jaki jest najlepszy sposób na zrobienie tego? Czy istnieje już oprogramowanie pośrednie, które może pomóc?
Ale co z prośbami spoza GET? A co z trasami wrażliwymi na wielkość liter, jak 'somePath'? Mogą być trasami zamontowanymi, tzn. Segment trasy nie będzie pierwszym po początkowym '/' w url. – estus
spowoduje to pobranie wszystkich typów tras, jednak można wykonać przekierowanie tylko na żądanie GET i zachować całą zawartość. Jeśli chcesz spróbować trochę mądrzejszego dopasowywania (po wstawieniu wielkości liter w linii 1), możesz użyć app._router.stack, aby wyświetlić wszystkie trasy i spróbować znaleźć część wrażliwą na wielkość liter –