多个 SPA 的 IIS 重写规则

IIS Rewrite rule for multiple SPAs

我们正在为我们的微前端创建一个新的架构,我们希望避免使用另一个框架来对其进行查询,例如 single-spa。我们公司目前在其他产品上使用 IIS,我们需要保持这种状态。

因此,为了让多个 SPA 响应同一个地址,我们只需将构建的 SPA 存放在 IIS 的内容目录中,如下所示:

IIS 根文件夹:

我可以正常访问 myhost/spa1myhost/spa2,并通过它们自己的内部路由进行导航(我们正在使用 Angular)。

问题是,我们想要没有 # 的 URL,并且我们需要告诉 IIS 将任何子路由重定向到它的 SPA 主路由。

我们有一些东西,它适用于 myhost/spa1myhost/spa1/detail,但不适用于 myhost/spa1/detail/1。比方说,第三层。

有人可以帮我解决这个问题吗?

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="SPA 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="{R:1}/" />
                </rule>
            </rules>
        </rewrite>
        <directoryBrowse enabled="true" />
    </system.webServer>
</configuration>

尝试使用此 URL 重写规则:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="SPA 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="{R:1}/{R:2}" />
                </rule>
            </rules>
        </rewrite>
        <directoryBrowse enabled="true" />
    </system.webServer>
</configuration>

经过几次试验和另一个要求(我们需要在 URL 中选择一个“公司”),我想出了一些非常有效的方法:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Application Hub Rule" stopProcessing="true">
                    <match url="(hub)(/?.*)" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="{R:1}/" />
                </rule>
                <rule name="CRM Customer Rule" stopProcessing="true">
                    <match url="(crm/customer)(/?.*)" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="{R:1}/" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

我知道这是非常独特的要求。但事实证明这些规则运作良好。一旦用户输入 my-host/COMP_CODE/hub,我的 Angular 应用程序就会处理 URL 更改,因为 my-host/COMP_CODE/hub/**/** 之后的所有内容都被 IIS 重定向到集线器的根文件夹。 一旦您输入 my-host/COMP_CODE/crm/customer 及其子路由,IIS 会将所有内容重定向到客户的根文件夹,并且 Angular 负责 URL 更改。

唯一的问题是,在您的 Angular 的 RouterModule.forRoot() 配置中,您需要确保 Angular 的路由器理解 path: ':db/hub'(以及其他事项)。

感谢那些试图提供帮助的人。