使用 UrlRewrite 防止 ARR 重写 302 重定向的 Location 标头

使用 UrlRewrite 防止 ARR 重写 302 重定向的 Location 标头

我正在尝试使用 ARR 和 urlrewrite 部署 jetty servlet 来创建反向代理。如果我启用“在响应标头中反向重写主机”,则一切似乎都运行正常。我通过 www.example.com/servlet 访问 servlet,浏览器中的地址保持不变,但通过 localhost:8080 访问 servlet。

问题是,此 servlet 根据获取参数返回 302 重定向。例如,如果我访问 www.example.com/servlet?input=cleaning,那么我将获得 302 重定向,该重定向可能会转到 www.cleaningexample.com/howtoclean。反向重写主机规则意味着客户端不会看到此 URL,而是返回 www.example.com/howtoclean。

我无法设置静态出站规则,因为我不知道 302 重定向可能会返回哪个地址。

如果我禁用反向重写主机,则浏览器中的 url 将从 www.example.com/servlet 更改为 localhost:8080/servlet。

我已尝试在出站规则中替换主机,但找不到任何地方来获取 servlet 返回的原始位置标头以替换重写的位置主机。

有没有办法让它正常工作?

答案1

你有没有想过这个问题?我遇到了完全相同的问题。我无法让这两种情况都正常运行。要么我选中该框,302 重定向会覆盖响应位置标头并且永远不起作用,要么我取消选中该框,HOST 标头为 localhost,因此应用程序无法完全正常工作。

就像复选框需要更智能一点,并说“如果不是 302,则执行此操作”。或者我必须添加规则/前后,但我认为这是不可能的。:-(

---- 20 分钟后,真的很幸运,找到了答案。

https://stackoverflow.com/a/14842856/8333628

%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/proxy -preserveHostHeader:true /commit:apphost

该命令,加上未选中响应标头中的反向重写主机似乎有效。外部重定向在未选中该框的情况下有效,并且使用该命令保留主机,下游应用程序不再看到 localhost:8080,而是在浏览器地址栏中看到原始主机。两者都有效!!!

可笑的是,UI 中根本没有preserveHostHeader选项。他们就是没有添加复选框。:) 如果您进入控制面板中的“配置编辑器”,您可以在xml模式中看到它。所以这是一个合法的设置,他们只是在UI选项中错过了它。:(

答案2

我刚刚在使用 IIS 作为我本地另一台 HTTP 服务器的反向代理时遇到了一个非常类似的问题。我不得不转到“应用程序请求路由缓存”模块。右侧窗格中有一个“服务器代理设置”链接。在该设置对话框中有一个“在响应标头中反向重写主机”复选框。取消选中此框解决了我的问题。

相关内容