在不中断URL的情况下将ember cli应用程序部署到S3
我正在开发一个在S3中部署的ember cli应用程序。我真的希望能够使用这种“无服务器”的方法,因为它的配置非常简单,而且价格也非常便宜 我对URL有问题。如果我击中了它,效果很好。但是如果我尝试直接加载一个页面而不是应用程序的根,比如,那么它会给出一个403,因为S3中没有这样的资源。(我可以通过应用程序很好地导航到这些页面,并且可以在我的机器上以开发模式直接点击它们,因此ember应用程序工作正常。) 寻找解决方案,我发现要添加在不中断URL的情况下将ember cli应用程序部署到S3,url,ember.js,amazon-s3,ember-cli,Url,Ember.js,Amazon S3,Ember Cli,我正在开发一个在S3中部署的ember cli应用程序。我真的希望能够使用这种“无服务器”的方法,因为它的配置非常简单,而且价格也非常便宜 我对URL有问题。如果我击中了它,效果很好。但是如果我尝试直接加载一个页面而不是应用程序的根,比如,那么它会给出一个403,因为S3中没有这样的资源。(我可以通过应用程序很好地导航到这些页面,并且可以在我的机器上以开发模式直接点击它们,因此ember应用程序工作正常。) 寻找解决方案,我发现要添加#到我的路径。这似乎更好,因为它不返回403,但当我点击时,它
#代码>到我的路径。这似乎更好,因为它不返回403,但当我点击时,它只是重定向到,丢失路径包含的任何特定信息
我有什么选择?有没有一种方法可以使用S3并拥有有效的URL?我需要服务器吗?还是有另一种方法让我迷路了?好吧,我很接近了。事实证明,正确的方法是:
我尝试过各种方法,但没有一种方法是没有的
代码>,并被/
包围。相关阅读是关于
值得注意的是,我正在使用:
App.Router.reopen({
location: 'auto'
});
另外,我在静态网站托管下使用了以下路由规则
403
my-bucket.s3-website-us-east-1.amazonaws.com
#/
只需将错误文档映射到index.html&您的locationType应设置为自动 仅使用基于#的重定向的方法几乎没有问题。我把它们列在下面:
在解析应用程序路径时,会发生多个重定向。例如:www.myapp.com/path/For/test被重定向为www.myapp.com/#/path/For/test
由于SPA框架的操作,“#”的出现和消失,url栏中会闪烁
搜索引擎优化受到影响,因为——‘嘿!这是谷歌强迫他使用重定向
对你的应用程序的Safari支持还需要一段时间
与Ember CLI Deploy提倡的Lightning部署方法不同的一种方法如下:
确保已为网站配置索引路由。主要是index.html
从S3配置中删除路由规则
在S3存储桶前面放一个Cloudfront李>
为Cloudfront实例配置错误页面规则。在错误规则中指定:
- Http错误代码:404(和403或根据需要的其他错误)
- 缓存最小TTL(秒)时出错:0
- 回答:是
- 响应页面路径:/index.html
- HTTP响应代码:200
5.为了满足SEO需求并确保index.html不缓存,请执行以下操作:
- 配置EC2实例并设置nginx服务器李>
- 将公共ip分配给EC2实例
- 创建一个ELB,其中包含您创建的EC2实例作为实例
- 您应该能够将ELB分配给您的DNS
- 现在,配置您的nginx服务器以执行以下操作:代理\将所有请求传递给您的CDN(仅针对index.html,直接从cloudfront服务其他资产),对于搜索机器人,按照Prerender.io等服务的规定重定向流量
我可以提供更多关于nginx设置的详细信息,只需留下一个注释。我已经用艰苦的方式学会了
一旦云端分发更新。使cloudfront缓存失效一次,使其处于原始模式。
点击浏览器中的url,一切都应该正常。我正在执行ember build--environment=production
然后将dist
文件夹复制到S3。我只在本地使用用于开发模式的节点服务器。(我不知道S3是如何提供文件的。)很高兴你让它工作起来了!我将删除以前的评论。:)那么这是否意味着,如果路径根没有这个“恼人的”小散列,Ember应用程序就不可能投入生产?我想我已经在这里分享了我所知道的一切,如果你阅读了链接的内容。我确实阅读了文档,但设置了App.Router.reopen({location:'history')代码>或<代码>应用程序路由器。重新打开({location:'auto'})代码>对我不起作用。只有hash
做了这个把戏,我不明白为什么或者如果链接文档中没有指定我需要做的其他操作。它确实说,尽管请记住,由于您的一些用户将使用HistoryLocation,您的服务器必须在您定义的所有路径上为Ember应用程序提供服务。
但这对我来说似乎很尴尬。啊,我误解了。对不起,这对我有用。我的项目只是一个玩具,所以我不担心
是否在某个浏览器中是必需的,我可以通过自动
功能将其从我的项目中删除。我将在我的答案中添加一个可能会有所帮助的细节。这部分完全由您的web服务器控制,而不是Ember。本质上,您的服务器需要知道,url中超过应用程序根部分的请求的任何部分都需要忽略,并且只需要提供url的根部分,在auto
的情况下,您为那些浏览器不支持搜索机器人的history
>的用户提供了一种机制,按照Prerender.io等服务的规定重定向流量您是使用Prerender.io还是将机器人重定向到其他类型的缓存?我在这里查看了用于重定向的nginx配置Prerender维护自己的缓存,除非您决定进行内部安装。您共享的配置-我在nginx中使用类似的东西来服务bot请求。这不是重定向,更像是代理请求转发,以从预渲染缓存获取响应。谢谢,我将尝试!!如果您有一个合法的404请求,那么prerender/google不会缓存结果吗?:\不确定
<RoutingRules>
<RoutingRule>
<Condition>
<HttpErrorCodeReturnedEquals>403</HttpErrorCodeReturnedEquals>
</Condition>
<Redirect>
<HostName>my-bucket.s3-website-us-east-1.amazonaws.com</HostName>
<ReplaceKeyPrefixWith>#/</ReplaceKeyPrefixWith>
</Redirect>
</RoutingRule>
</RoutingRules>