繁体   English   中英

带有Angular路由的IIS重写规则

[英]IIS Rewrite rule with Angular routing

我正在构建一个ASP.NET MVC和Angular 1.x混合应用程序。 我使用MVC作为外壳,然后在其上分层Angular。 我这样做有两个原因。 首先,它使我能够为脚本引用创建HTML帮助器类以支持缓存清除。 其次,它允许我“推送”一组服务器端配置,以适应Web服务URL等内容。所有这些似乎都可以正常工作,除了一个问题。

当前,我必须处理几个IIS重写规则才能使所有这些正常工作。 在今天的分阶段环境中进行测试时,我发布了一个指向Facebook的链接,尽管该链接似乎无法正常工作,但我不确定为什么。 根据我对规则语法的理解,我认为它会起作用,但并非如此。

以下是我目前在web.config中拥有的IIS重写规则以及为什么拥有每个规则:

  <system.webServer>
    <rewrite xdt:Transform="Replace">
      <rules>
        <rule name="cachebust">
          <match url="([\S]+)(/v-[0-9]+/)([\S]+)" />
          <action type="Rewrite" url="{R:1}/{R:3}" />
        </rule>
        <rule name="baseindex" stopProcessing="true">
          <match url=".*" />
          <conditions logicalGrouping="MatchAll">
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
          </conditions>
          <action type="Rewrite" url="/" />
        </rule>
        <rule name="non-www" stopProcessing="true">
          <match url="(.*)" negate="false"></match>
          <conditions>
            <add input="{HTTP_HOST}" pattern="^exampledomain\.org$" negate="true"></add>
          </conditions>
          <action type="Redirect" url="http://exampledomain.org/{R:1}"></action>
        </rule>
      </rules>
    </rewrite>
  </system.webServer>

1)“ cachebust”规则用于脚本缓存清除。 我编写的HTML帮助程序采用了脚本文件的路径,并在该路径中插入了一个伪造的版本#。 例如,“ scripts / example.js”将变为“ scripts / v-123456789 / example.js”,其中“ 123456789”是当前日期和时间的刻度。 该规则会将URL改写回原始URL,但是由于页面是通过版本标记的路径输出的,因此如果它们发生更改,它将迫使我的角度脚本由浏览器重新加载。 此规则似乎运行良好。 感谢Mads: https//madskristensen.net/blog/cache-busting-in-aspnet/

2)“ baseindex”规则用于重写URL,以便ASP.NET始终提供index.cshtml页面,该页面用作我的网站的根目录。 此规则似乎也可以正常工作。 对此SO QA表示感谢如何为IIS配置URL以HTML5模式重写AngularJS应用程序?

3)“非www”规则是有问题的。 该规则的目标是根据ScottGu的博客文章(以下链接)将所有www请求重定向到非www请求,有关规范主机名及其对SEO的影响。 此规则对于www.example.org来说是完美的,因为它会将URL重定向到example.org,但是在URL看起来像这样时失败:www.example.org/entity/1其中实体是id = 1的详细信息页面实际上,它对于www.example.org/about也失败。 由于我的Web服务需要启用CORS,因为它们位于单独的域中,因此也需要这样做。 https://weblogs.asp.net/scottgu/tip-trick-fix-common-seo-problems-using-the-url-rewrite-extension

为了完整起见:Angular启用了HTML 5模式,并且我到指定页面的路线定义如下:

.state('entityDetail', {
                    url: '/entity/{id}',
                    templateUrl: 'app/pages/entity/entityDetail.html',
                    controller: 'entityDetailController',
                    controllerAs: 'entityDetailCtrl'
                })

另外,我的_Layout.cshtml包含以下内容的基本href:

<base href="/" />

和类似的脚本引用(需要上面列出的cachebust规则的角度脚本除外):

<script type="text/javascript" src="scripts/jquery-2.2.0.min.js"></script>

我尝试了该规则的几种不同版本,但是它们都导致了不同的问题。 由于这里有许多不同的事情在起作用,因此我担心自己忽略了某些事情,或者在思考此“应该”如何工作时我错了。

任何帮助将不胜感激。

经过一番尝试和尝试才能弄清这一切,但是想要发布答案,如果有人尝试将ASP.NET MVC和Angular 1.x结合在一起,同时允许Google Chrome浏览器中的缓存无效化,我最终想出了答案。

事实证明这是两件事:

1)规则的顺序。

2)stopProcessing标志以及何时启用它。

总而言之,为了使其正常工作,我构建了规则,以便所有请求都必须重定向到www.exampledomain.com,然后停止处理规则,直到发生重新处理的请求为止(这次将保证www。)。 然后,cachebust规则必须在重写为基本索引“ /”之前发生,否则,当必须“删除”的每个脚本文件装入时,服务器将返回整个HTML文档。 从一开始,这实际上就是我的大部分问题。 老实说,整个过程有点令人困惑,因此,如果这个答案还不够,请发表评论,我将尽力更好地阐明我在研究中发现的“为什么”。 希望这对其他人有帮助...只花了10天的时间就知道了。 :)

<system.webServer>
    <rewrite xdt:Transform="Replace">
      <rules>
        <rule name="forcewww" patternSyntax="ECMAScript" stopProcessing="true">
          <match url=".*" />
          <conditions logicalGrouping="MatchAny">
            <add input="{HTTP_HOST}" pattern="^exampledomain.com$" />
          </conditions>
          <action type="Redirect" url="http://www.exampledomain.com/{R:0}" />
        </rule>
        <rule name="cachebust">
          <match url="([\S]+)(/v-[0-9]+/)([\S]+)" />
          <action type="Rewrite" url="{R:1}/{R:3}" />
        </rule>
        <rule name="baseindex">
          <match url=".*" />
          <conditions logicalGrouping="MatchAll">
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
          </conditions>
          <action type="Rewrite" url="/" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM