AngularJS 在 IIS 上使用 HTML5mode(true) 和 <default document>
AngularJS with HTML5mode(true) on IIS and <default document>
我有一个在 IIS 8.0(arvixe 托管)上运行的简单应用程序,它使用 AngularJS 作为 SPA 框架。我打开 html5mode 并将标签链接到 index.html(根文件),我还将此文件设置为 web.config 中的。我知道你必须做我有的服务器端重写。
我想要实现的是:
用户输入 'domain.com' 并且站点加载域。com/home。当然在 URL 下实际上是域。com/index.html/home 但是 html5mode 通过重写来处理它。
这是 app.config,这很好。
.config(['$routeProvider', '$locationProvider', function ($routeProvider, $locationProvider ) {
$routeProvider
.when('/home', {
templateUrl: 'templates/home.html',
controller: 'HomeController'
})
.when('/login', {
templateUrl: 'templates/login.html',
controller: 'LoginController'
})
.when('/forum', {
templateUrl: 'templates/forum.html',
controller: 'ForumController'
})
.when('/rebellinks', {
templateUrl: 'templates/rebellinks.html',
controller: 'RebelLinksController'
})
.when('/events', {
templateUrl: 'templates/events.html',
controller: 'EventsController'
})
.when('/oldnews', {
templateUrl: 'templates/oldnews.html',
controller: 'OldNewsController'
})
.otherwise({
redirectTo: '/home'
});
//use HTML5 History API
$locationProvider.html5Mode(true);
}]);
Web.Config IIS 文件:
<system.webServer>
<rewrite>
<rules>
<clear />
<!--<rule name="jsRule" stopProcessing="true">
<match url=".js" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{REQUEST_FILENAME}" matchType="IsFile" />
</conditions>
<action type="None" />
</rule>-->
<rule name="SRBShome" enabled="true" stopProcessing="true">
<match url="^(.*)$" />
<action type="Rewrite" url="/index.html" />
</rule>
<rule name="AngularJS" enabled="false" 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="/index.html" />
</rule>
</rules>
</rewrite>
<defaultDocument enabled="true">
<files>
<clear />
<add value="index.html" />
<add value="home.html" />
</files>
</defaultDocument>
这样做是加载域。com/home 当用户访问网站时,.js 文件被传输,因为我在重写中添加了一个特殊规则以防止他们重写,但我认为我的模式需要调整 SRBShome 规则才能正常工作。
感谢任何帮助。
通过更改下面的重写规则解决了这个问题。这允许 index.html 在 IIS 上加载。由于某些原因,web.config 不适用于此设置。所以现在当用户请求 domain.com 重写传递 '/index.html' 然后 AngularJS' html5Mode 启动并清理 URL 并删除 hashbang。
<rewrite>
<rules>
<clear />
<rule name="SRBShome" enabled="true" stopProcessing="true">
<match url="^(.+)$" negate="true" />
<conditions>
<add input="{REQUEST_URL}" pattern="^(.+)$" negate="true" />
</conditions>
<action type="Rewrite" url="/index.html" logRewrittenUrl="true"/>
<!--<match url="^.com" />
<action type="Rewrite" url="/index.html" />-->
</rule>
<rule name="AngularJS" enabled="true" 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="/index.html" />
</rule>
</rules>
</rewrite>
我有一个在 IIS 8.0(arvixe 托管)上运行的简单应用程序,它使用 AngularJS 作为 SPA 框架。我打开 html5mode 并将标签链接到 index.html(根文件),我还将此文件设置为 web.config 中的。我知道你必须做我有的服务器端重写。
我想要实现的是:
用户输入 'domain.com' 并且站点加载域。com/home。当然在 URL 下实际上是域。com/index.html/home 但是 html5mode 通过重写来处理它。
这是 app.config,这很好。
.config(['$routeProvider', '$locationProvider', function ($routeProvider, $locationProvider ) {
$routeProvider
.when('/home', {
templateUrl: 'templates/home.html',
controller: 'HomeController'
})
.when('/login', {
templateUrl: 'templates/login.html',
controller: 'LoginController'
})
.when('/forum', {
templateUrl: 'templates/forum.html',
controller: 'ForumController'
})
.when('/rebellinks', {
templateUrl: 'templates/rebellinks.html',
controller: 'RebelLinksController'
})
.when('/events', {
templateUrl: 'templates/events.html',
controller: 'EventsController'
})
.when('/oldnews', {
templateUrl: 'templates/oldnews.html',
controller: 'OldNewsController'
})
.otherwise({
redirectTo: '/home'
});
//use HTML5 History API
$locationProvider.html5Mode(true);
}]);
Web.Config IIS 文件:
<system.webServer>
<rewrite>
<rules>
<clear />
<!--<rule name="jsRule" stopProcessing="true">
<match url=".js" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{REQUEST_FILENAME}" matchType="IsFile" />
</conditions>
<action type="None" />
</rule>-->
<rule name="SRBShome" enabled="true" stopProcessing="true">
<match url="^(.*)$" />
<action type="Rewrite" url="/index.html" />
</rule>
<rule name="AngularJS" enabled="false" 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="/index.html" />
</rule>
</rules>
</rewrite>
<defaultDocument enabled="true">
<files>
<clear />
<add value="index.html" />
<add value="home.html" />
</files>
</defaultDocument>
这样做是加载域。com/home 当用户访问网站时,.js 文件被传输,因为我在重写中添加了一个特殊规则以防止他们重写,但我认为我的模式需要调整 SRBShome 规则才能正常工作。
感谢任何帮助。
通过更改下面的重写规则解决了这个问题。这允许 index.html 在 IIS 上加载。由于某些原因,web.config 不适用于此设置。所以现在当用户请求 domain.com 重写传递 '/index.html' 然后 AngularJS' html5Mode 启动并清理 URL 并删除 hashbang。
<rewrite>
<rules>
<clear />
<rule name="SRBShome" enabled="true" stopProcessing="true">
<match url="^(.+)$" negate="true" />
<conditions>
<add input="{REQUEST_URL}" pattern="^(.+)$" negate="true" />
</conditions>
<action type="Rewrite" url="/index.html" logRewrittenUrl="true"/>
<!--<match url="^.com" />
<action type="Rewrite" url="/index.html" />-->
</rule>
<rule name="AngularJS" enabled="true" 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="/index.html" />
</rule>
</rules>
</rewrite>