在不中断URL的情况下将ember cli应用程序部署到S3

在不中断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,但当我点击时,它

我正在开发一个在S3中部署的ember cli应用程序。我真的希望能够使用这种“无服务器”的方法,因为它的配置非常简单,而且价格也非常便宜

我对URL有问题。如果我击中了它,效果很好。但是如果我尝试直接加载一个页面而不是应用程序的根,比如,那么它会给出一个403,因为S3中没有这样的资源。(我可以通过应用程序很好地导航到这些页面,并且可以在我的机器上以开发模式直接点击它们,因此ember应用程序工作正常。)

寻找解决方案,我发现要添加
#到我的路径。这似乎更好,因为它不返回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>