wangzhibo
2026-05-09 53418655c061ac26f66058253f39200aced1ab1d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
<?xml version="1.0" encoding="utf-8"?>
<!--
  IIS 站点级 web.config 示例:在「同一站点、80/443」上同时承载
  - /board   → Board ASP.NET Core(建议作为该站点下的「应用程序」物理路径指向发布目录,不由本文件反代)
  - 其它路径 → 反向代理到本机 DataEase(如 http://127.0.0.1:8100)
 
  使用前请安装:
  - URL Rewrite 模块
  - Application Request Routing(ARR),并在服务器节点启用 Proxy
 
  重要说明:
  - nginx 的 auth_request(子请求鉴权)在 IIS 中没有一行等价的内置指令。
  - 本示例仅覆盖「路径分流 + 反代 DataEase + 转发头」。
  - 若必须保留「访问 / 任意路径前必须先通过 /board/check/」的行为,见仓库说明或单独网关方案。
-->
<configuration>
  <system.webServer>
    <!-- 若反代路径含编码字符,按需开启 -->
    <!--
    <security>
      <requestFiltering allowDoubleEscaping="true" />
    </security>
    -->
 
    <rewrite>
      <allowedServerVariables>
        <!-- 需在 URL Rewrite「查看允许的服务器变量」中允许下列变量(或在 IIS 管理器中逐个添加) -->
        <add name="HTTP_X_FORWARDED_HOST" />
        <add name="HTTP_X_FORWARDED_FOR" />
        <add name="HTTP_X_FORWARDED_PROTO" />
        <add name="HTTP_X_ORIGINAL_URI" />
      </allowedServerVariables>
 
      <rules>
        <!-- 1) /board 及其子路径:交给本站点下的 /board 应用程序处理(不要用反代覆盖) -->
        <rule name="Board_App_SkipProxy" stopProcessing="true">
          <match url=".*" />
          <conditions logicalGrouping="MatchAll">
            <add input="{REQUEST_URI}" pattern="^/board(/|$)" />
          </conditions>
          <action type="None" />
        </rule>
 
        <!-- 2) 其余请求:反代到 DataEase -->
        <rule name="ReverseProxy_DataEase" stopProcessing="true">
          <match url="(.*)" />
          <conditions logicalGrouping="MatchAll">
            <add input="{REQUEST_URI}" pattern="^/board(/|$)" negate="true" />
          </conditions>
          <serverVariables>
            <set name="HTTP_X_FORWARDED_HOST" value="{HTTP_HOST}" />
            <set name="HTTP_X_FORWARDED_FOR" value="{REMOTE_ADDR}" />
            <!-- HTTPS 站点请改为 https;纯 HTTP 保持 http -->
            <set name="HTTP_X_FORWARDED_PROTO" value="http" />
            <set name="HTTP_X_ORIGINAL_URI" value="{REQUEST_URI}" />
          </serverVariables>
          <action type="Rewrite" url="http://127.0.0.1:8100/{R:1}" />
          <appendQueryString>true</appendQueryString>
        </rule>
      </rules>
 
      <!-- 可选:把 DataEase 响应里指向 8100 的 Location 改回当前站点(按实际 Location 形态调整) -->
      <!--
      <outboundRules>
        <rule name="Strip8100FromLocation" preCondition="IsRedirect">
          <match serverVariable="RESPONSE_Location" pattern="^http://127\.0\.0\.1:8100/(.*)" />
          <action type="Rewrite" value="https://{HTTP_HOST}/{R:1}" />
        </rule>
        <preConditions>
          <preCondition name="IsRedirect">
            <add input="{RESPONSE_STATUS}" pattern="^30[12]$" />
          </preCondition>
        </preConditions>
      </outboundRules>
      -->
    </rewrite>
 
    <!-- 反代时建议保留原始 Host,避免上游生成错误绝对 URL(在 ARR 服务器代理设置里也可勾选) -->
    <proxy preserveHostHeader="true" reverseRewriteHostInResponseHeaders="true" />
  </system.webServer>
</configuration>