IIS 重写 2 Angular 个应用程序
IIS Rewrite 2 Angular applications
我有 2 个 Angular 申请。一个在我的主域中,另一个在该域内名为 "merchant" 的虚拟目录中。
我想重写两者的规则,这样我就可以在地址栏中输入 URL 而不会出现 404 页面。为此,我在两个文件夹中都放置了 web.config,但我无法让两个应用程序重写规则同时工作。
在主应用程序中 web.config 我有
<rewrite>
<rules>
<rule name="block" stopProcessing="true">
<match url="^merchant/(.*)$" />
<action type="Redirect" url="merchant/{R:1}" />
</rule>
<rule name="Application Routes" patternSyntax="Wildcard">
<match url="*" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="/" />
</rule>
</rules>
</rewrite>
有了这个 conf,重写对于主应用程序来说效果很好,但对于第二个应用程序来说就不行了。我以为第一条规则会重定向到虚拟文件夹 web.config 但似乎不是。低于我的虚拟文件夹中的规则 web.config:
<rewrite>
<rules>
<rule name="AngularJS 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="/merchant/" />
</rule>
</rules>
</rewrite>
当然,如果我从主 web.config 中删除所有规则,则第二个可以工作,但不再是第一个了...
如何同时获得两者?
终于找到解决办法了。正如 funkizer 评论的那样,我不得不将所有规则放在同一个 web.config
在主 web.config 下方有 2 个规则
<rewrite>
<rules>
<rule name="AngularJS Routes" stopProcessing="true">
<match url="^merchant/(.*)$" />
<conditions >
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="merchant/" />
</rule>
<rule name="Application Routes" patternSyntax="Wildcard">
<match url="*" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="/" />
</rule>
</rules>
</rewrite>
我还必须保留另一个 web.config 但我删除了里面的所有规则。
现在可以使用直接 url
访问这两个应用程序
我有 2 个 Angular 申请。一个在我的主域中,另一个在该域内名为 "merchant" 的虚拟目录中。 我想重写两者的规则,这样我就可以在地址栏中输入 URL 而不会出现 404 页面。为此,我在两个文件夹中都放置了 web.config,但我无法让两个应用程序重写规则同时工作。
在主应用程序中 web.config 我有
<rewrite>
<rules>
<rule name="block" stopProcessing="true">
<match url="^merchant/(.*)$" />
<action type="Redirect" url="merchant/{R:1}" />
</rule>
<rule name="Application Routes" patternSyntax="Wildcard">
<match url="*" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="/" />
</rule>
</rules>
</rewrite>
有了这个 conf,重写对于主应用程序来说效果很好,但对于第二个应用程序来说就不行了。我以为第一条规则会重定向到虚拟文件夹 web.config 但似乎不是。低于我的虚拟文件夹中的规则 web.config:
<rewrite>
<rules>
<rule name="AngularJS 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="/merchant/" />
</rule>
</rules>
</rewrite>
当然,如果我从主 web.config 中删除所有规则,则第二个可以工作,但不再是第一个了...
如何同时获得两者?
终于找到解决办法了。正如 funkizer 评论的那样,我不得不将所有规则放在同一个 web.config 在主 web.config 下方有 2 个规则
<rewrite>
<rules>
<rule name="AngularJS Routes" stopProcessing="true">
<match url="^merchant/(.*)$" />
<conditions >
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="merchant/" />
</rule>
<rule name="Application Routes" patternSyntax="Wildcard">
<match url="*" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="/" />
</rule>
</rules>
</rewrite>
我还必须保留另一个 web.config 但我删除了里面的所有规则。 现在可以使用直接 url
访问这两个应用程序