我在单个AWS EC2实例上运行Nodejs和Angularjs应用程序。应用程序的代码结构如下:
目前,当用户第一次调用应用程序时,调用由nodejs express框架处理,调用将定向到angular static directory中的index.html页面,使用server / server.js中的以下代码文件
res.sendFile(path.resolve(__dirname + '/../web/dist/index.html'));
从index.html,调用各种静态组件(JS,HTML,CSS等),并且所有angularjs控制器/服务都会回调nodejs API以满足用户请求。
这种安排在单一实例中运行良好。现在我想移动角度静态内容(即web目录到AWS S3)。这样做,我是否必须将server.js中的以下代码更改为:
res.sendFile(path.resolve('**AWS S3 URL** +/web/dist/index.html'));
因为我的静态文件现在已移至AWS S3。此外,在这样做时,我必须修改所有角度控制器和服务以使用Nodejs API调用的绝对路径。这意味着要进行大量更改并引入部署配置(以后我们必须提供灵活性)。
我们可以采取的另一种方法是通过在server / server.js中进行以下更改,将index.html从web移动到服务器文件夹:
res.sendFile(path.resolve(__dirname + '/../server/index.html'));
然后在server.js中添加以下代码来处理从Nodejs到S3的静态内容的重定向,如下所示:
app.get('/assets/*', function(req, res){
var requestURL = req.url;
var redirectedURL = <<**Remote S3 base URL**>> + requestURL;
res.redirect(redirectedURL);
});
然而,关注的是会有很多重定向,我想知道,如果这是一个好的设计?我已经读过,搜索引擎不喜欢具有大量重定向(HTTP 301,304)的应用程序,并将这些页面排名较低。因此,我试图找出在AWS EC2上部署nodejs和在S3上部署静态angularjs内容时的最佳实践。任何建议都将受到高度赞赏。
答案 0 :(得分:0)
您可以通过将文件的s3网址添加到index.html来直接访问s3中的内容。
如果你想从s3提供 index.html ,那么你必须将index.html一个重定向到s3,所有其他你可以直接从s3加载到浏览器。
如果您真的想快速提供公共内容,我建议使用 cloudfront 是一个选项,您可以直接从cloudfront提供所有公共内容,而无需访问您的节点服务器,所有api调用都会到来到您的节点服务器。但是,它取决于您的应用程序的体系结构。