我正在尝试使用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>
答案 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>