Firebase SPA 重写规则未重定向到 index.html

Firebase SPA rewrite rules not redirecting to index.html

我刚开始使用 AngularJS 框架在 Firebase 托管上构建一个 单页应用程序。我有 运行 firebase init 并选择将所有 url 重写为 /index.html ,如下所示:

"hosting": {
    "public": "public",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "**",
        "destination": "/index.html"
      }
    ]
  },

我将部分视图模板存储在以下文件夹中:

public/templates/home/dashboard.html
public/templates/courses/default.html

我的 Angular 路由 工作正常,我的 public/index.html 检查授权访问,包括那些部分视图,并将用户重定向到登录视图如果用户尚未通过身份验证。

但是,当我尝试将我的模板 HTML 文件 的 URL 直接粘贴到浏览器地址栏 时,Firebase 不会将 重定向到 /index.html:

http://localhost:5000/templates/home/dashboard.html
http://localhost:5000/templates/courses/default.html

以上所有模板文件都加载到浏览器上,任何知道这些模板文件 URL 的未经授权的用户都可以查看。我尝试将以下规则添加到我的 firebase.json 文件中,但其中 none 有效:

测试#1:

"rewrites": [
      {
        "source": "**",
        "destination": "/index.html"
      }, 
      {
        "source": "/templates/**/.*",
        "destination": "/index.html"
      }
    ]

测试#2:

"rewrites": [
      {
        "source": "**",
        "destination": "/index.html"
      }, 
      {
        "source": "/templates{,/**}",
        "destination": "/index.html"
      }
    ]

注意: 我每次尝试都重新启动 firebase serve,但我不确定缓存是否会影响此类测试。我也不知道怎么清除服务器缓存

我的问题是:

  1. 为了在直接访问这些部分视图模板时将用户重定向到 /index.html,编写 url 重写规则的正确方法是什么?
  2. 如果无法阻止通过 Firebase url 重写规则直接访问部分视图模板,出于安全目的,是否有其他方法可以阻止这种情况?

Firebase 托管将优先于动态重写提供静态内容。 See this hosting order.

如果您不想直接访问这些视图,您可以将它们移动到云功能并设置您的主机以重新路由 "templates" 以服务于该云功能。然后您可以将您的云功能配置为 provide/deny 根据需要访问。

使用重定向而不是重写

"hosting": {
    "redirects": [ {
        "source": "/foo",
        "destination": "/bar",
        "type": 301
    } ]
}

将 ** 添加到 source 以附加 destination 附加 URL 字符串。

例如

"hosting": {
    "redirects": [ {
        "source": "/foo**",
        "destination": "/bar",
        "type": 301
    } ]
}

导致 /foo?var=bar 重定向到 /bar?var=bar

有关详细信息,请参阅 Configure redirects