Reactjs 子应用程序上的IIS URL重定向

Reactjs 子应用程序上的IIS URL重定向,reactjs,iis,url-rewriting,Reactjs,Iis,Url Rewriting,我有一个托管在IIS中的现有ASP.Net MVC,它正在使用react SPA进行扩展/替换,react SPA必须位于应用程序IIS中的站点下方 这是因为有许多针对多个客户机的部署实例,由于业务原因无法租用,现有系统是web表单,并且由于其构建方式,不希望将SPA添加到项目中,我们决定,子应用程序将是部署新功能的最简单方式——不希望再出现另一个MVC项目,也不希望WebApi项目服务于静态页面,因为其他与客户机相关的定制必须与之配套 SPA与一个新的WebApi后端对话,该后端本身就是rea

我有一个托管在IIS中的现有ASP.Net MVC,它正在使用react SPA进行扩展/替换,react SPA必须位于应用程序IIS中的站点下方

这是因为有许多针对多个客户机的部署实例,由于业务原因无法租用,现有系统是web表单,并且由于其构建方式,不希望将SPA添加到项目中,我们决定,子应用程序将是部署新功能的最简单方式——不希望再出现另一个MVC项目,也不希望WebApi项目服务于静态页面,因为其他与客户机相关的定制必须与之配套

SPA与一个新的WebApi后端对话,该后端本身就是react应用程序下的一个应用程序

要帮助可视化,它如下所示:

现在所有这些都可以正常工作了,只需一个普通的href就可以从父应用程序加载SPA,SPA可以愉快地与WebApi后端对话

我遇到的困难是整理IIS Url重写规则,这样,如果用户在SPA中点击F5,IIS将返回SPA index.html,然后客户端路由(react router v4)将处理呈现正确组件的操作

url重写规则在v5应用程序中定义

我已经遵循了一些问题的建议,例如和,如果react SPA位于站点的根目录,那么它工作得很好,但当我移动到子应用程序时,我收到的是一个404响应,表示找不到完整的Url,例如,当请求Url
localhost/v5/documents
IIS试图找到一个v5/documents文件/目录,该文件/目录不存在

为了使现有系统脱离这个等式,我将站点部署到一个新文件夹中,其中顶级站点没有内容,react站点位于v5应用程序中,webapi位于api文件夹中——同样,所有工作正常

我尝试了几种匹配模式,当前使用的模式是
*/v5/?.
,IIS管理器中的测试模式功能告诉我,该模式与我期望的url匹配,例如
localhost/v5/documents
的url应该匹配,但实际上从未匹配过

我找到了Rick和Strahl的帖子,其中涉及到创建规则,但运气不佳

我目前使用的完整配置是

<rewrite>
  <rules>
    <rule name="Rewrite Text Requests" enabled="true" stopProcessing="true">
      <match url=".*/v5/?.*" />
      <conditions logicalGrouping="MatchAll">
                <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                <add input="{REQUEST_URI}" pattern="/api(.*)$" negate="true" />
                <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
      </conditions>
      <action type="Rewrite" url="{HTTP_HOST}/v5/index.html" logRewrittenUrl="false" />
    </rule>
  </rules>
</rewrite>


我在windows 10上使用IIS 10.0.15063.0,使用create react应用程序创建react站点(我使用的是生产版本而不是webpackdevserver进行测试),WebApi项目是.Net Framework 4.7,我只是用我能想到的最简单的方式重现了您的场景

我用两个应用程序/v5和/v5/api创建了一个名为MySite的网站

我将以下内容放在v5应用程序的web.config中,因此web.config位于v5的根目录中

<rewrite>
    <rules>
        <rule name="Rewrite Text Requests" enabled="true" stopProcessing="true">
        <match url=".*" />
        <conditions logicalGrouping="MatchAll">
                    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                    <add input="{REQUEST_URI}" pattern="^/v5/api(.*)$" negate="true" />
                    <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
        </conditions>
        <action type="Rewrite" url="/v5/index.html" logRewrittenUrl="false" />
        </rule>
    </rules>
</rewrite>

规则的url匹配v5应用程序下的所有内容。如果目标是api应用程序中的文件、目录或任何内容,则使用这些条件进行回退


重写操作中不需要主机名。

是否检查了模块的顺序?静态文件是否在URL重写之前执行?模块的顺序正确,与重写规则的位置和试图匹配的模式有关。当我使用位于站点根目录的实际父应用程序(web forms app)运行该模块时,它与空的父应用程序完美配合webforms应用程序中的每个请求都返回一个304,并给出index.html。很遗憾,我需要父应用程序继续当前的工作。您是将设置放在父应用程序(web窗体应用程序)或v5应用程序的web.config中?我预计,如果它在父应用程序的web配置中,那么它将导致父应用程序不再运行。但是,如果它位于v5应用程序的web.config中,则父应用程序不应受到任何影响。我不知怎么搞砸了,在v5中尝试了,但没有成功,因此在根目录下尝试了,结果如所述。现在再次回到它,仔细检查了所有内容,它非常适合react站点,需要对webforms站点进行一些额外的调整