давайте по порядку чтоли.
есть SPA smth с роутами /a и /b.
если оно написано с hash-based routing, оно может выглядеть, например, как stage.my.domain/smth#/a (тестовое окружение) и smth.my.domain#/a в проде. в этом случае артефакты со стейджа на прод промоутятся простым копированием, в конфиге nginx нет try_files, в в случае прихода пользователя на внутренний url приложения базовый url приложения тривиально вычисляется из window.location.pathname и window.location.hash.
если оно написано с history-based routing, начинаются последствия. в случае прихода пользователя на внутренний url приложения, stage.my.domain/smth/a, нам нужно
1 - всегда отдавать index.html на все внутренние url приложения(try_files в nginx на location /smth)
2 - на старте SPA нужно понять, а куда вообще пришел пользователь, потому что текущий url - это base url + route, и где между ними граница - хз.
в Js п.2 принято(react-router, angular) решать запеканием base url в приложение при сборке, что приводит к необходимости либо точной унификации окружений, либо правилу "все spa на поддоменах", либо невозможности промоушена копированием.
да, чисто в теории можно вычислить base url отрезая префиксы location и пытаясь выбрать роут, но это как-то довольно спорно звучит.