20

我在 IIS 7.5 站点上有 URL 重写设置:http: //site1.com/

这充当第二个站点的反向代理:http: //site2.com/

以下是事件流程:
1. 浏览器在http://site1.com/somepath
上执行 GET 2. 这被传递到 site2,因为 site1 是 URL 重写反向代理。这很好用并且主机设置正确,因为我已经完成了需要这个的mod。
3. site2 以 301 状态响应并将 HTTP Location 标头设置为http://site3.com/somenewpath
4. site1 以 301 响应浏览器,但将 Location 标头中的主机替换为site1:http://site1 .com/somenewpath

我希望在第 4 步中发生的是 site1 在 HTTP Location 标头中响应http://site3.com/somenewpath并直接传递这些数据。我觉得必须有一个出站规则可以用来解决这个问题,但还没有弄清楚。

4

3 回答 3

39

是否会涉及应用程序请求路由?查看 IIS -> Machine or Site -> Application Request Routing Cache -> Server Proxy Settings 并取消选中“Reverse rewrite host in response headers”复选框。如果您在机器级别执行此操作,它将对所有站点生效。如果您在特定站点上执行此操作,它将仅对该站点生效,并且该框上的其他站点将不受影响。

于 2014-05-12T03:57:29.057 回答
8

正如我在上面的评论中所说,我相信反向代理的默认行为是原封不动地通过响应(假设没有设置出站重写规则)。不过,我还没有专门使用来自代理后面的服务器的 301 响应来测试您的场景。

如果实际上需要特殊的出站规则,则此代码将修改所有对http://site3.com/somepath的 301 响应的 HTTP 位置标头

<outboundRules>
  <!-- This rule changes the domain in the HTTP location header for redirect responses -->
  <rule name="Change Location Header">
    <match serverVariable="RESPONSE_LOCATION" pattern="^http://[^/]+/(.*)" />
    <conditions>
      <add input="{RESPONSE_STATUS}" pattern="^301" />
    </conditions>
    <action type="Rewrite" value="http://www.site3.com/{R:1}" />
  </rule>
</outboundRules>

此规则是对URL 重写模块 2.0 配置参考中发布的规则的轻微修改

于 2014-05-09T19:20:51.737 回答
0

接受的答案使我朝着正确的方向前进,但必须对没有Server Proxy Settings上述内容的较新版本的 IIS 进行更多挖掘。

归功于这些 URL:

IIS AAR - 反向代理的 URL 重写 - 如何发送 HTTP_HOST

防止带有 UrlRewrite 的 ARR 为 302 重定向重写 Location 标头

在 Web 服务器上,打开配置编辑器并转到路径system.WebServer -> proxy。将 更改reverseRewriteHostInResponseHeadersFalse。这将阻止Location响应标头中的标头被重写。

我链接到的答案是指preserveHostHeader设置,在我的情况下它没有解决问题。(我来自服务器的响应是 302,位置标头中有新的 Url)

于 2021-11-16T13:29:24.963 回答