为什么在代理后面运行应用程序时,ASP.NET MVC的Redirect方法为何设置了错误的Location标头?

时间:2018-10-29 22:12:11

标签: c# asp.net asp.net-mvc asp.net-mvc-4

使用MVC的Redirect方法时遇到问题。我在一个简单的IIS代理后面运行我的MVC4 Web应用程序。 IIS代理使用一个简单的重写规则,以便可以在名为“旧版”的文件夹下访问该站点。规则如下:

proxy.host.com/legacy/{whatever} => host.com:81/{whatever}

但是在某些情况下,我需要重定向到完全不适用代理规则的域中的域。我创建了一个简单的端点,该端点可以重定向到外部域:

public class ApplicationController
{
    [AllowAnonymous]
    public ActionResult TestRedirect(string returnUrl)
    {
        return this.Redirect("http://AnotherDomain.com/SomeRoute");
    }
}

如果我这样调用此端点:

http://proxy.host.com/legacy/Application/TestRedirect

并使用Fiddler之类的工具捕获流量,我看到调用此终结点的结果是这样的:

HTTP/1.1 302 Found
Location: proxy.host.com/Application/SomeRoute
//... Other data omitted for simplicity

<html><head><title>Object moved</title></head><body>
<h2>Object moved to <a href="http://anotherDomain.com/Application/SomeRoute">here</a>.</h2>
</body></html>

如您所见,响应的主体具有预期的域(已传递给Redirect方法,但Location标头不包含相同的域。我希望location标头包含该域传递到Redirect()中。也就是说,我希望响应看起来像这样:

HTTP/1.1 302 Found
Location: http://anotherDomain.com/Application/SomeRoute
//... Other data omitted for simplicity

<html><head><title>Object moved</title></head><body>
<h2>Object moved to <a href="http://anotherDomain.com/Application/SomeRoute">here</a>.</h2>
</body></html>

我应该补充一点,如果我关闭代理或通过调用host.com:81/Application/TestRedirect绕过它,则该方法将按预期工作并且响应Location标头与响应主体匹配。

有人可以解释一下为什么我在响应中得到的Location标头的意外结果与响应正文不同吗?如何使重定向按预期工作?

谢谢。

0 个答案:

没有答案