如何configurationIIS的URL在HTML5模式下重写AngularJS应用程序?

我有AngularJS种子项目 ,我已经添加了

$locationProvider.html5Mode(true).hashPrefix('!'); 

到app.js文件。 我想configurationIIS 7将所有请求路由到

 http://localhost/app/index.html 

所以这对我有用。 我该怎么做呢?

更新:

我刚刚发现,下载并安装了IIS URL重写模块 ,希望这会使我的目标变得简单明了。

更新2

我想这总结了我想要实现的(从AngularJS开发者文档中获取 ):

使用这种模式需要在服务器端进行URL重写,基本上你必须重写所有的链接到你的应用程序的入口点(例如index.html)

更新3:

我仍然在这个工作,我意识到我不需要redirect(有重写规则)的某些url,如

 http://localhost/app/lib/angular/angular.js http://localhost/app/partials/partial1.html 

所以在css,js,lib或partials目录中的任何东西都不会被redirect。 其他一切都需要redirect到app / index.html

任何人都知道如何轻松实现这一点,而不必为每个文件添加一个规则?

更新4:

我有2个入站规则在IIS URL重写模块中定义。 第一条规则是:

IIS URL重写入站规则1

第二条规则是:

IIS URL重写入站规则2

现在,当我导航到localhost / app / view1时,它会加载页面,但支持文件(css,js,lib和partials目录中的文件)也正在被重写到app / index.html页面 – 作为index.html页面,不pipe使用什么URL。 我想这意味着我的第一条规则,这应该是防止这些URL被第二条规则处理,不工作..任何想法? …任何人? …我感觉很孤单… :-(

$locationProvider.html5Mode(true)app.js设置后,我在web.config中写出一条规则。

希望帮助别人。

  <system.webServer> <rewrite> <rules> <rule name="AngularJS Routes" stopProcessing="true"> <match url=".*" /> <conditions logicalGrouping="MatchAll"> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> <add input="{REQUEST_URI}" pattern="^/(api)" negate="true" /> </conditions> <action type="Rewrite" url="/" /> </rule> </rules> </rewrite> </system.webServer> 

在我的index.html中,我将它添加到<head>

 <base href="/"> 

不要忘记在服务器上安装IIS URL重写 。

另外,如果您使用Web API和IIS,则由于第三个input(条件第三行),如果您的API位于www.yourdomain.com/api ,则这将起作用。

问题中所示的IIS入站规则可以工作。 我必须清除浏览器caching,并在index.html页面的<head>部分的顶部添加以下行:

 <base href="/myApplication/app/" /> 

这是因为我在localhost中有多个应用程序,所以对其他部分的请求被带到localhost/app/view1而不是localhost/myApplication/app/view1

希望这可以帮助别人!

在我设置了正确的重写规则后,我一直保持403.14。 事实certificate,我有一个与我的一个URL路由名称相同的目录。 一旦我删除了IsDirectory重写规则我的路线工作正常。 是否有删除目录否定可能导致问题的情况? 我想不出在我的情况下。 我能想到的唯一情况是如果你可以用你的应用程序浏览一个目录。

 <rule name="fixhtml5mode" stopProcessing="true"> <match url=".*"/> <conditions logicalGrouping="MatchAll"> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> </conditions> <action type="Rewrite" url="/" /> </rule> 

只有这两个条件的问题:

  <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> 

只有在{REQUEST_FILENAME} 物理存在于磁盘上时 ,它们才能工作。 这意味着,可能会出现这样的情况:对不正确命名的部分视图的请求将返回根页面而不是404,这将导致angular度被加载两次(并且在某些情况下,会导致令人讨厌的无限循环)。

因此,build议使用一些安全的“后备”规则来避免这些难以解决的问题:

  <add input="{REQUEST_FILENAME}" pattern="(.*?)\.html$" negate="true" /> <add input="{REQUEST_FILENAME}" pattern="(.*?)\.js$" negate="true" /> <add input="{REQUEST_FILENAME}" pattern="(.*?)\.css$" negate="true" /> 

或符合任何文件结尾的条件:

 <conditions> <!-- ... --> <add input="{REQUEST_FILENAME}" pattern=".*\.[\d\w]+$" negate="true" /> </conditions> 

我find的最简单的方法就是将触发404的请求redirect到客户端。 即使设置了$locationProvider.html5Mode(true)也可以添加hashtag。

这个技巧适用于在同一网站上有更多Web应用程序的环境,并要求URL完整性约束(EG外部authentication)。 这里是一步一步的如何做

的index.html

正确设置<base>元素

 <base href="@(Request.ApplicationPath + "/")"> 

web.config中

首先将404redirect到自定义页面,例如“Home / Error”

 <system.web> <customErrors mode="On"> <error statusCode="404" redirect="~/Home/Error" /> </customErrors> </system.web> 

家庭控制器

实现一个简单的ActionResult来在客户端路由中“翻译”input。

 public ActionResult Error(string aspxerrorpath) { return this.Redirect("~/#/" + aspxerrorpath); } 

这是最简单的方法。


有可能(build议?)增强错误function与一些改进的逻辑redirect404到客户端只有当url有效,并让404正常情况下,当客户端上找不到任何东西。 假设你有这些angular度路线

 .when("/", { templateUrl: "Base/Home", controller: "controllerHome" }) .when("/New", { templateUrl: "Base/New", controller: "controllerNew" }) .when("/Show/:title", { templateUrl: "Base/Show", controller: "controllerShow" }) 

只有以“/ New”或“/ Show /”开头的URLredirect到客户端才有意义。

 public ActionResult Error(string aspxerrorpath) { // get clientside route path string clientPath = aspxerrorpath.Substring(Request.ApplicationPath.Length); // create a set of valid clientside path string[] validPaths = { "/New", "/Show/" }; // check if clientPath is valid and redirect properly foreach (string validPath in validPaths) { if (clientPath.StartsWith(validPath)) { return this.Redirect("~/#/" + clientPath); } } return new HttpNotFoundResult(); } 

这只是改进逻辑的一个例子,当然每个Web应用程序都有不同的需求