我们使用Lightning Deploy策略部署了我们的Ember App,其中包括:
当点击实例时,index.html从Redis获得服务,随后在点击App中的任何路由时,App路由将被提供。
但是,当我们在Ember App的URL中手动输入任何正确的路由时,Nginx会抛出错误,指出找不到路由。我们在这里做错了什么?
答案 0 :(得分:3)
当使用网址命中子请求(例如mydomain.com/login
或刷新页面)时,浏览器会向nginx
发送请求,而nginx将无法找到login
在任何地方找到页面并返回404 error
。这是因为nginx无法将子路由传递到index.html
页面,后者又可以为子路由提供服务。为了解决这个问题,在nginx中使用了以下位置块。
# This block handles the subrequest. If any subroutes are requested than this rewrite the url to root and tries to render the subroute page by passing the subroute to index file (which is served by the redis).
location ~* / {
rewrite ^ / last;
}
这里我们对nginx说,对于任何子请求,将url重写为root (/)
位置(root位置从redis提供索引页)并找到所请求的页面。 last
选项尝试通过重新访问nginx中定义的所有blocks
来查找特定页面,因此它可以转到根位置。
可以找到详细说明和完整的nginx配置here。
答案 1 :(得分:2)
如果我正确理解你,你需要让所有路由都搞砸了。
当你点击index.html时,redis会为实例提供服务,但当你点击任何其他网址时,你需要告诉nginx提供相同的index.html并让ember处理该路由。
我在Ember Discuss上找到了这个可能有帮助的地方。
server {
listen 80 default;
server_name my.domain.com;
root /path/to/app/root;
location / {
rewrite ^ /index.html break;
}
location /assets/ {
# do nothing and let nginx handle this as usual
}
}
我正在使用Play Framework,我也在使用Lighting Deploy策略,我不得不创建一个路由/*
,它获取路由到我的控制器,然后控制器从redis中检索索引。