我刚刚开始使用AngularJS框架在Firebase Hosting上构建单页应用程序。我已经运行了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 文件的网址直接粘贴到浏览器地址栏上时,Firebase 不会将其重定向到/index.html
:
http://localhost:5000/templates/home/dashboard.html
http://localhost:5000/templates/courses/default.html
上述所有模板文件都加载到浏览器上,并且任何知道这些模板文件的URL的未经授权的用户都可以查看。我尝试将以下规则添加到我的firebase.json
文件中,但它们都不起作用:
测试#1:
"rewrites": [
{
"source": "**",
"destination": "/index.html"
},
{
"source": "/templates/**/.*",
"destination": "/index.html"
}
]
测试#2:
"rewrites": [
{
"source": "**",
"destination": "/index.html"
},
{
"source": "/templates{,/**}",
"destination": "/index.html"
}
]
注意:我确实每次尝试都重新启动firebase serve
,但我不确定缓存是否会影响这种类型的测试。我也不知道如何清除服务器缓存。
我的问题是:
- 编写 url 重写规则以便在直接访问这些分部视图模板时将用户重定向到
/index.html
的正确方法是什么? - 如果无法阻止通过 Firebase 网址重写规则直接访问部分视图模板,出于安全考虑,我可以通过其他方法阻止这种情况吗?
Firebase 托管将提供静态内容,优先级高于动态重写。请参阅此托管顺序。
如果您不希望直接访问这些视图,则可以将它们移动到云功能,并设置托管以重新路由"模板"以服务于该云功能。然后,您可以配置云功能以根据需要提供/拒绝访问。
使用重定向而不是重写
"hosting": {
"redirects": [ {
"source": "/foo",
"destination": "/bar",
"type": 301
} ]
}
将 ** 添加到源以附加目标并附加其他 URL 字符串。
例如
"hosting": {
"redirects": [ {
"source": "/foo**",
"destination": "/bar",
"type": 301
} ]
}
导致/foo?var=bar
重定向到/bar?var=bar
有关详细信息,请参阅配置重定向。