IIS重写IP:{domain} / {thing}

时间:2018-08-26 15:35:13

标签: iis url-rewriting reverse-proxy

我要做什么:

  • 我拥有一个域,例如 blahblahblah.com
  • 在服务器上,它正确指向:80 :443 -这可以正常工作
  • 我想重新映射,以便如果用户访问 blahblahblah.com/ thing1 ,那么它将映射到 localhost:5000
  • 类似地,我还想重新映射,以便如果用户访问 blahblahblah.com/ thing2 ,那么它将映射到我本地网络上的另一台服务器和端口(未公开上网)

我本质上想使用我的Web服务器通过“子目录”或此实例中称为“站点/子目录”,“站点2 /子目录”的任何名称与网络上的其他服务器和其他端口进行通信。我已经尝试解决这个问题好几天了!我已经在IIS上安装了ARR(并启用了代理)和URL Rewrite模块。

我尝试过上帝知道SO上有多少种不同的重写模板。我可以获得部分成功,其中/ thingx /路由可以解决,但是所有资源都引用blahblahblah.com,并且(适当地)找不到该地址的站点资源。

当前重写(解析 blahblahblah.com/ thing1 中的一些资源,但其他路由错误):

<rewrite>
  <rules>
    <rule name="Thing1" enabled="true">
       <match url="(thing1*)" />
       <action type="Rewrite" url="http://localhost:5000/{R:0}" />
     </rule>
  </rules>
</rewrite>

编辑:根据Microsoft文档Reverse Proxy with URL Rewrite v2 and Application Request Routing中的这篇文章,我将规则更新为以下内容。这些重写据说完全可以满足我的需要,但是对于我来说,结果并不相同,我仍然不知道为什么。

<rules>
    <rule name="Thing1" enabled="true">
        <match url="^thing1/(.*)" />
        <action type="Rewrite" url="https://localhost:5000/{R:0}" />
    </rule>
</rules>
<outboundRules>
    <rule name="Add application prefix" preCondition="IsHTML">
        <match filterByTags="A" pattern="^/(.*)" />
        <conditions>
            <add input="{URL}" pattern="^/(thing1)/.*" />
        </conditions>
        <action type="Rewrite" value="/{C:1}/{R:1}" />
    </rule>
    <preConditions>
        <preCondition name="IsHTML">
            <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
        </preCondition>
    </preConditions>
</outboundRules> 

更多说明:

  • localhost:5000正常工作
  • localhost/thing1在“ 404未找到”中解决
  • blahblahblah.com/thing1解决了拉入默认HTML页面的问题,但是没有资产(javascript,css等)返回404 Not Found。

编辑:可能需要注意,这些规则已写入IIS'web.config的默认站点(绑定到:80,:443)中。在C:\Windows\System32\inetsrv\config\applicationHost.config中编写这些规则将得到500。

有任何关于我做错事情的反馈吗?

1 个答案:

答案 0 :(得分:1)

部分原因是 SPA 的处理方式(# 和历史模式),但我最终解决了以下用于 IIS 的 webconfig,它允许我将所有内容嵌套在 /foobar 端点下:

    <rewrite>
      <rules> 
        <rule name="Subdirectory Index" stopProcessing="true">
          <match url="^foobar/index\.html$" ignoreCase="false" />
          <action type="None" />
        </rule>
        <rule name="Subdirectory Routes" stopProcessing="true">
          <match url="." ignoreCase="false" />
          <conditions>
          <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
          <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
          </conditions>
          <action type="Rewrite" url="/foobar/index.html" />
        </rule>
      </rules>
    </rewrite>