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
,但我不确定缓存是否会影响此类测试。我也不知道怎么清除服务器缓存
我的问题是:
- 为了在直接访问这些部分视图模板时将用户重定向到
/index.html
,编写 url 重写规则的正确方法是什么?
- 如果无法阻止通过 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。
我刚开始使用 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
,但我不确定缓存是否会影响此类测试。我也不知道怎么清除服务器缓存
我的问题是:
- 为了在直接访问这些部分视图模板时将用户重定向到
/index.html
,编写 url 重写规则的正确方法是什么? - 如果无法阻止通过 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。