ASP.net OWIN AngularJS html5mode url重定向

时间:2015-09-03 23:42:36

标签: asp.net angularjs web-config rewrite owin

我正在尝试使用Web API restful后端设置单页面应用程序。我使用了" OWIN WebAPI SPA模板"开始我的项目。此模板默认提供给解决方案根目录下的公共/文件夹的静态文件。我想支持html5网址,IE。 localhost / madeUpPath应该在index.html页面上。为此,我在Web.config文件中设置了重写规则:

<system.webServer>
  <rewrite>
      <rules>
          <rule name="Main Rule" stopProcessing="true">
              <match url=".*" />
              <conditions logicalGrouping="MatchAll">
                  <add input="{REQUEST_URI}" pattern="api/" ignoreCase="true" negate="true" />

                  <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>

我遇到的问题是,由于静态文件位于/ public / {REQUEST_FILENAME}认为文件是相对于/并且url localhost / main.css被重写为localhost /

我尝试将规则更改为:

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

但这不起作用。我怎样才能达到理想的效果?谢谢。

编辑:我发现了一些似乎有用的东西,但并不是我想要的东西。

<rewrite>
    <rules>
        <rule name="Main Rule" stopProcessing="true">
            <match url="([a-zA-Z0-9-_.\/]+\.(css|js|less|json|jpeg|jpg|png|gif|svg|xml|html))$" />
            <action type="Rewrite" url="/public/{R:0}" />
        </rule>
        <rule name="Second Rule" 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>
    </rules>
</rewrite>

2 个答案:

答案 0 :(得分:0)

首先,此代码并不是因为您正在使用OWIN服务器来处理静态文件:

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

请您使用下一个代码:

<rewrite>
    <rules>
        <rule name="Main Rule" stopProcessing="true">
            <match url="^((?!(api|\.)).)*$" />
            <action type="Rewrite" url="/" />
        </rule>
    </rules>
</rewrite>

正则表达式使我们能够忽略api和任何文件路径。

答案 1 :(得分:0)

我们还使用Owin从子文件夹中提供内容,以下内容适用于我们:

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

它与this comment非常相似,但我将{REQUEST_URI}变量更改为{URL},这样即使它们有查询字符串也会忽略现有文件,这是缓存破坏资源所必需的,例如site.css?ec99043d9af49f2bd7c2

编辑:我刚刚找到了this Microsoft example,通过一些调整也可能适用于这种情况,但我还没有自己测试过:

  <rewrite>
    <rules>
      <rule name="Angular Routes" 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="/MyApp/" />
      <!--<action type="Rewrite" url="/" />-->
      </rule>
    </rules>
  </rewrite>