我有一个使用Ember CLI构建的EmberJS应用程序。
为了部署我的应用程序,我在Ember CLI中使用了ember build --release
命令,并将/dist
文件夹中的输出复制到与IIS映射的文件夹中。
一切似乎都很好。当您在SPA内导航时,会更新URL,从Web服务等获取数据。但是,如果我尝试直接访问localhost/someurl
,则会收到404 Not Found错误。我猜这是因为IIS 7中的路由,但我如何使用Ember路由工作呢?
答案 0 :(得分:10)
我知道这个问题已经过时但是我找到了一个非常好的解决方案,使用IIS URL重写模块(https://www.iis.net/downloads/microsoft/url-rewrite)基本上模仿了apache的mod_rewrite。
基本上,您在web.config中定义重写规则,将您放在IIS目录中的dist / *文件放在一起,然后转到城镇。
这是我的web.config中的重写规则块。
var containingBoth = [];
function checkArrays(toCheck, toCheckAgainst){
for(var i=0;i<toCheck.length;i+=1){
for(var j=0;j<toCheckAgainst.length;j+=1){
if (toCheck[i] === toCheckAgainst[j]) {
containingBoth.push(toCheck[i]);
}
}
}
}
如果您删除IsDirectory检查,那么它仍将使用IIS的404用于坏目录。
这允许您在不使用/#/技术的情况下在IIS中托管ember应用程序。
答案 1 :(得分:5)
让它在IIS上运行的最简单方法,就像其他路由框架在像Sammy.js这样在IIS中工作的方式,就是在网址中包含一个哈希,如http://0.0.0.0:4200/#/your-route/
在EmberJS中,这可以通过修改应用程序路由器来实现:
var Router = Ember.Router.extend({
location: 'hash'
});
在您的情况下,由于您使用的是ember-cli,因此修改了environment.config文件:
var ENV = {
...
locationType: 'hash'
... };
答案 2 :(得分:1)
我正在ASP.Net WebApi
使用Identity
我还想避免为不存在的文件返回index.html
,所以我这样做了:
<system.webServer>
<rewrite>
<rules>
<rule name="to-ember" stopProcessing="true">
<match url="^/?(.+\.[a-z0-9]+$|token$|api/)" ignoreCase="true" negate="true"/>
<action type="Rewrite" url="index.html"/>
</rule>
</rules>
</rewrite>
</system.webServer>