在具有不同主页的单页应用程序中路由

Posted

技术标签:

【中文标题】在具有不同主页的单页应用程序中路由【英文标题】:Routing in a Single Page Application with a different home page 【发布时间】:2016-03-03 18:56:05 【问题描述】:

我有一个单页应用程序 - 这意味着服务器上的所有内容都被重定向到单个 index.html 文件,该文件使用 HTML5 历史 API (pushstate) 完成繁重的工作和路由。

现在,我想在旁边添加一个新的登录页面 - 我们称之为 landing.html,我希望客户在访问 /index.html 时首先访问 landing.html,如果他们访问任何其他路线.

现在 IE9 不支持 HTML5 历史 API,所以使用像 /books/authors 这样的“hash urls”路径在其中变为 /#!/books/authors。由于 URL is not sent to the server 的哈希部分就服务器而言,所有路径都是 /,这意味着我无法根据该逻辑路由到 landing.htmlindex.html

我想到了一个技巧 - 将带有 / 的 URL 重定向到 landing.html,在客户端检测 #!,在服务器(或客户端)上添加一个名为 notReallyHomePage 的 cookie 并重定向到正确的页面基于服务器上的cookie。这真的很hacky,不是一个好的解决方案。

在这种情况下处理路由的正确方法是什么?

我的后端在 ASP.NET MVC 中,但我认为这与问题无关

【问题讨论】:

何不使用 ASP.NET MVC 提供的路由功能。 @Antony 因为这不是单页应用程序的工作方式。路由是在客户端完成的——所以当用户点击一个链接时,你实际上并不需要访问服务器。优点是大多数路由只需要来自服务器的 JSON(而不是标记),而其他路由则可以完全跳过服务器。 您可能想要一个包含路由逻辑的索引/容器页面之类的东西。该页面根据所选路线部分加载。由于您的路线没有被发送到服务器,我认为不可能立即加载正确的页面。 看看projects.jga.me/routie。似乎适合这份工作 @Cerbrus 这仍然意味着客户端的另一次往返。 【参考方案1】:

Hmmmmm...landing.html 的内容是什么?从它的名字我猜这是一个非常简单的页面。

难道你不能让它的内容成为 index.html 的一部分并根据“第一次使用”的逻辑隐藏/显示它吗? 或者,如果landing.html 是您的营销或其他东西创建的一些奇怪的页面,则将其放置在根据相同逻辑隐藏/显示的 iframe 中。

(显然当你显示landing.html然后你隐藏index.html)

【讨论】:

不,拥有着陆页的一半目的是不加载整个 index.html。 好吧,在这种情况下,您的 cookie 解决方案似乎是最好的解决方法。就像你说的,把它叫做“landingPageVisited”之类的,默认情况下“/”会重定向到landing.html,除非cookie被设置为true。听起来不像 那个 hack-y :)

以上是关于在具有不同主页的单页应用程序中路由的主要内容,如果未能解决你的问题,请参考以下文章

如何设置NGINX以根据位置(在相同的server_name下)部署不同的单页应用程序(SPA的...即静态文件)和子路由

如何设置 NGINX 以部署不同的单页应用程序(SPA 的...即静态文件),具体取决于位置(在相同的 server_name 下)和子路由

颤振如何与单页网页和不同的路由网址一起工作?

App Engine + Polymer.dart 带有 hashbang 的单页 Web 应用路由

带有 socket.io 的单页应用程序中的特定于部分的侦听器

具有基于 HttpOnly cookie 的身份验证和会话管理的单页应用程序