我正在开发一个具有客户端路由器的单页面应用程序。所以尽管运行应用程序的基本URL将是http :: //example.com或http :: //example.com/index.html - 跳过路径'/'和'/index.html的域名“
但在我的应用程序的某个地方,由于我的客户端路由器,我可能会调用类似'/ appointmentments / 20160113的路由,客户端路由器会将我重定向到我的SPA内相应的“约会页面”,通过参数今天约会。
但是,如果用户直接调用http://example.com/appointments/20160113,我会认为服务器应该直接使用/index.html进行响应,以便浏览器不会获得404。
我正在使用nodejs构建服务器(特别是http2模块,但我不认为这非常重要,我的示例不使用https,尽管他们使用http2)。我只是尝试更改服务器,所以如果它使用未知网址命中,则会使用index.html文件进行响应。
然而,浏览器将此视为第一个响应,然后相对于url请求其余附加文件(例如跟进/ appointmentments / 20160113 / styles / main的CSS)。这导致无限循环,因为服务器使用index.html中的另一个副本进行响应(并立即获得/appointments/20160113/styles/styles/main.css的请求)。
在javascript运行的页面生命周期中过早(特别是路由器软件),显然这种方法太简单了。
我还编写了客户端路由器(使用历史api),以便我可以根据需要更改内容。
应如何处理此情况。我想也许是301重定向到/index.html或者其他东西然后路由器的初始调度知道这个并且可以做一个popstate或者什么。理想情况下,我希望通过外部方式支持用户之间传递URL,但在我真正尝试实现它之前,我还没有意识到这些含义。
答案 0 :(得分:0)
我不知道这是不是最好的方法,但是在这里没有收到任何答案,我决定尝试一些不同的方法,看看哪种方法效果最好。
每种方式都涉及到301重定向到/index.html,然后提供我通过不同机制重定向的URL
这就是我试过的
最后我拒绝了1)因为chrome在我使用它之后没有删除cookie并且使值短缺取决于客户端和服务器之间的准确定时。解决方案似乎太脆弱了。
我试过2)它看起来很好,直到我来测试它。不幸的是,设置window.location.search导致页面重新加载,我真的很难找到发生了什么。然而,我在3)中发现的关于模拟的内容很可能提供给基于2的解决方案,因此它可以被使用。我仍然可以回到这个解决方案,因为它感觉"对我说。
我试过3)并且效果很好。然而,由于我的路由器元素在初始化期间使用了#fragment,因此我在测试中遇到时间问题,但是我无法设置window.location.hash,直到在测试套件中建立路由器之后。我想用sinon模拟window.location.hash所以我可以控制它,但事实证明你不能
解决方法是让路由器将自己的调用包装到库中的window.location.hash中,以便我可以模拟库。这就是我最终所做的一切,并且一切顺利。
我可以回到使用查询字符串并在库调用中包装window.location.search,这样我就可以存根调用并避免页面重新加载的问题。