如何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重写模块中定义。 第一条规则是:
第二条规则是:
现在,当我导航到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应用程序都有不同的需求