反向代理301重定向时,URL重写会保留原始主机位置

时间:2014-05-07 04:48:59

标签: url-rewriting http-headers iis-7.5 arr outbound

我在IIS 7.5网站上进行了URL重写设置:http://site1.com/

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

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

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

2 个答案:

答案 0 :(得分:25)

可以Application Request Routing参与吗?看看IIS - >机器或站点 - >应用程序请求路由缓存 - >服务器代理设置并取消选中“在响应标头中反向重写主机”复选框。如果您在机器级别执行此操作,它将对所有站点生效。如果您在特定网站上进行此操作,它将仅对该网站生效,并且该框中的其他网站将不受影响。

答案 1 :(得分:6)

正如我在上面的评论中所说,我认为反向代理的默认行为是不受影响地传递响应(假设没有设置出站重写规则)。但是,我还没有专门针对来自代理服务器后面的服务器的301响应来测试您的场景。

如果确实需要特殊的出站规则,此代码会修改所有301个回复的http://site3.com/somepath

的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 Rewrite Module 2.0 Configuration Reference

中发布的规则