IIS 重写 url 中的哈希 (#)

IIS Rewrite hash(#) in url

提问人:Miquel 提问时间:11/2/2023 更新时间:11/3/2023 访问量:40

问:

我正在使用一个使用 .NET 作为后端和 ReactJS 作为前端框架的应用程序。目前,我们想从 React Hash Router 迁移到 React Browser Router。变化进行得很顺利。我们面临的唯一问题是,我们无法编写成功的IIS重写规则,将带有“#”的URL重定向到没有哈希的URL。

有没有办法使用IIS重定向来更改: https://sampleApp/#/category/3/id/45255 到: https://sampleApp/category/3/id/45255

我们已经尝试了该规则和一些变体。

<rule name="HashRemoval" stopProcessing="true">
   <match url="(.*)#(.*)" />
   <action type="Redirect" url="{R:1}{R:2}" redirectType="Permanent" />
 </rule>
reactjs asp.net IIS URL 重写

评论

0赞 Lex Li 11/2/2023
请将其分解为较小的问题并研究:1)为什么URL中有s,2)为什么浏览器会处理它们,而不是像IIS这样的Web服务器。那么你应该知道答案。#
0赞 Miquel 11/2/2023
嗨,@LexLi“#”从无到有,来自 React Hash Router (reactrouter.com/en/main/router-components/hash-router)。
0赞 Lex Li 11/2/2023
stackoverflow.com/questions/7909969/......听起来这么多年后人们忘记了实际含义。

答:

0赞 Jalpa Panchal 11/3/2023 #1

在 IIS 中,URL 重写模块本身不会处理 URL 的定位部分,因为此部分是在客户端处理的,而不是作为 HTTP 请求的一部分发送到服务器。请求不会到达服务器,因此 IIS URL 重写规则无法与之匹配,因为它永远不会在服务器端的传入请求中看到。

因此,如果您在客户端执行重定向,那将是 batter。

if (window.location.hash) {
  const newLocation = window.location.href.replace(/#/, '');
  window.location.replace(newLocation);
}

下面是 iis url 重写路由器规则:

<rule name="ReactAppRoutes" 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="/index.html" />
</rule>