在刷新页面上将用户重定向到startpage - 使用重写规则iis

时间:2014-10-23 14:43:57

标签: angularjs iis url-rewriting

angularjs app将在网址http://ip.us/angularjs/

上初始化

angularjs生成像

这样的网址

http://ip.us/angularjs/#/link/ http://ip.us/angularjs/#/link/link

当用户点击刷新按钮时,iis应该重定向到 http://ip.us/angularjs/

我创建了以下规则:

   <rewrite>
        <rules>
            <rule name="angularjs" stopProcessing="true">
                <match url="#.*" />
                <action type="Redirect" url="http://ip.us/angularjs/" appendQueryString="true" />
            </rule>
        </rules>
    </rewrite>

但似乎在例如http://ip.us/angularjs/#/link/上会被忽略 这个模式怎么了?

1 个答案:

答案 0 :(得分:1)

服务器仅在主题标签之前提供URL。这就是它在AngularJS中用于提供客户端路由的原因。当您点击http://ip.us/angularjs/#/link/时,服务器只会看到http://ip.us/angularjs/。 “#/ link /”是浏览器使用的“书签”(或者在这种情况下,AngularJS用于决定要匹配的客户端路由)。

因此,IIS上的匹配规则永远不会触发。检查您的服务器日志,您应该看到#符号中的路径信息未显示在请求中。当然,我相信你的设置的服务器端正在做你想要的。无论#。

之后可能存在什么,它总是提供http://ip.us/angularjs/

所以,你想要做的重写需要在Angular中处理客户端 - 虽然我不确定你想要的行为。

如果您希望重新加载到其他地方(即始终以“#/”开头),请考虑在其中一个控制器中检查范围/ rootScope变量(或将其抽象为服务以使其更清晰)(w / o知道你的应用程序是如何设置的,我不能更具体),如果值为null,则转到基本角度路径(因为重新加载会导致重置此值)。然后,您只需在基本路由中将该值设置为true - 因此在重新加载后强制每个人都通过基本客户端路由。

当然,要了解默认行为通常是人们想要的。如果有人在http://ip.us/angularjs/#/link/并且重新加载,则Angular应用程序的默认行为是它将从服务器重新加载http://ip.us/angularjs/(应该是您的Angular html,其中包含指向其所需的所有其他内容的链接)并将匹配ngRoute或ui-router映射中的“#/ link /”路由/状态。