7

我正在努力摆脱当前的情况:我们在某个服务器上部署了一个聚合物 SPA ( A ) 并绑定到某个 url:http ://example.com/A ,我们确实需要显示遗留页面旧应用程序暂时,为了做到这一点,已经开发了一个新应用程序 ( B ) 并将其绑定到不同的 url ( http://example.com/B )。

B 所做的是构建旧应用程序的页面并暴露一个按钮,其目的是通过访问 document.referrer 值并重新加载页面来返回到先前的位置,问题是作为一个 SPA,URL 没有存在于服务器上。

更详细:

  1. 用户登录应用程序 A ( http://example.com/A/overview )
  2. 用户使用 SPA 并最终访问由路由管理的某个 url ( http://example/A/stuff/we/sell/jackets )
  3. 在页面http://example.com/A/stuff/we/sell/jackets中有一个指向应用程序 B 的链接,构成了显示夹克的旧应用程序页面
  4. 用户单击该链接并转到http://example.com/ B /legacy/jackets,此时 document.referrer 等于http://example.com/ A /stuff/we/sell/jackets
  5. 用户单击按钮关闭视图,应用程序 B 将窗口的位置设置为文档。referrer 试图从他/她来自的地方登陆用户。
  6. 作为应用程序 A 的 SPA,服务器上不存在URL http://example.com/ A /stuff/we/sell/jackets,并且用户(正确地)获得了 404。

那么问题来了:有没有什么办法可以拦截app路由中window.location变量的变化,避免页面完全刷新,让用户进入链接所在的页面呢?

4

2 回答 2

3

如果我理解正确,那么这似乎是您的服务器配置的问题。

如果您确实有 SPA,您希望所有 URL 都转到您的 app-shell(通常是您的 index.html)。

例子:

http-root
├─ some-folder
│  └─ index.html
└─ index.html

例如,如果您正在运行 apache,您可以访问:

  • http://example.com/index.html
  • http://example.com/some-folder/index.html

如果你去http://example.com/stuff/we/sell你会得到一个错误,因为stuff它不是一个有效的目录。

在您的 SPA 中,您可能会有一些路由系统,可以让您四处走动并对 Url 进行更改,而无需重新加载。因此,如果您使用您的 SPA,然后进行真正的重新加载,您应该仍然会回到原来的位置。

这将如何工作取决于您的服务器。例如,对于 apache,您可以通过.htaccess.

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html[L]
</IfModule>

无论您的 url 是什么,都使用它,您将始终以 http-root 结尾index.html。然后您的 SPA 可以接管;阅读 url 并显示适当的数据。

恕我直言,在服务器上解决此问题是您问题的适当解决方案。

于 2018-02-22T07:26:21.113 回答
1

我确实同意@daKmoR 实际上你不应该从服务器接收 404 - 你可以从聚合物应用程序中得到它。

获取一个文件,如果它不存在,然后尝试 index.html。每个服务器看起来都不一样。您使用的是什么服务器?我可以帮助 IIS 和 nginx。

于 2018-02-23T14:03:29.600 回答