代码之家  ›  专栏  ›  技术社区  ›  MistyK

使用资源/当前访问时,IIS路由器站点重写规则找不到资源文件

iis
  •  0
  • MistyK  · 技术社区  · 6 年前

    在我的IIS上,我以以下方式配置了重写规则。 有一个路由器站点,它侦听端口80并通过指定的资源(例如,当用户进入主机时)重写到适当的网站 http://testpage.com/current 它将其重写到端口5001下托管的另一个网站。示例配置:

      <rule name="RewriteRule" stopProcessing="true">
                        <match url="^current(.*)?" />
                        <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
                        <action type="Rewrite" url="http://{HTTP_HOST}:5001/{R:1}" />
                    </rule>
    

    5001下托管的站点包含索引。html和javascript文件 index.js 其中引用了 index.html 这样地:

    <script type="text/javascript" src="/index.js">
    

    当我更换时,整个配置工作得非常好

        <match url="^current(.*)?" />
    

    具有

      <match url="^(.*)?" />
    

    但是当我使用 current 然后在这里找到 指数html 位于端口5001下托管的页面中,但找不到 指数js公司 . 我怀疑原因是因为它试图找到 /current/index.js 但它并不存在。 我一直认为 RewriteRule 基本上应该将url重写为

    http://testpage.com:5001
    

    然后获取 指数html 并决心 指数js公司 来自当前目录,所以它不应该有任何关于“当前”资源的知识。 有没有简单的方法来解决这个问题? 显然,当我这样进入网站时: http://testpage.com:5001 ,绕过重写规则,工作正常。

    1 回复  |  直到 6 年前
        1
  •  0
  •   MistyK    6 年前

    我会回答这个问题以备将来参考。这不是重写规则的问题。问题在于html解析资源的方式。 我们需要执行几个步骤:

    1. 设置 <base href="virtualpath"> ,在此示例中,virtualpath应等于 /current . 我们在TeamCity部署期间使用webpack在此处输入正确的值。例子:

      <script type="text/javascript"> window.virtualpath = window.location.pathname.toLowerCase().indexOf("${virtual_path_legacy}") >= 0 ? "/${virtual_path_legacy}" : ""; document.write("<base href='" + window.virtualpath + "/'/>"); </script>

      new webpack.DefinePlugin({ "process.env": { NODE_ENV: JSON.stringify("production") }, virtual_path_legacy: JSON.stringify(virtual_path_legacy) })

    2. 在里面 webpack.config.js 确保您的 publicPath 是“”而不是“/”

    3. 如果您使用 SignalR 确保将virtualpath传递给 $.hubConnection (如果信号器托管在virtualpath下) 在里面净核心:

      app.UseAppBuilder(appBuilder => appBuilder.MapSignalR(rootPath, hubConfiguration), camelCaseSerialization);

    4. 如果您使用 react-router 确保将virtualpath传递给 useRouterHistory . 例子:

      const browserHistory = useRouterHistory(createHistory)({ basename: infoService.virtualpath, });

    5. 如果使用以下库 fetch 要连接到API,请确保使用virtualpath作为所有API URL的前缀(如果您的API也使用virtualpath)