2

我的网站有一个由 http 访问的公共部分和一个需要登录的 https 部分。当注销该站点时,它会重定向到 http 公共索引页面。

以前,我也通过说明完整的网址来完成此操作。最近我不得不摆脱这些东西,以便该站点可以在多个域上运行以进行测试。

我尝试使用 UriBuilder 将 https 链接转换为 http 链接,以便网站不再需要使用直接指向特定 url。这应该允许站点使用任何域名。现在它指向计算机名称。

if (Request.IsSecureConnection)
{
    UriBuilder ub = new UriBuilder();
    ub.Path = "/html/index.html";
    ub.Scheme = Uri.UriSchemeHttp;
    ub.Port = -1; // use default port for scheme
    Response.Redirect(ub.Uri.ToString(), true);

    //An old direct link to the site
    //Response.Redirect("http://www.someaddress.com/html/index.html");
}

当代码在测试服务器上远程触发而不是指向正确的域时,它会将我返回到该地址

http://localhost/html/index.html

代替

http://testserver/html/index.html

我不知道为什么这样做而不是返回我连接到服务器的地址。

4

2 回答 2

1

如果您未指定主机,"localhost"则将使用默认主机 ( ) - 请参阅MSDN 上的UriBuilder()构造函数文章。

修复:指定主机(可能基于传入请求的主机)。

 ub.Host = GetMeIncomingHost();
于 2013-12-16T19:38:47.510 回答
0

因为在您要重定向到的 URI 中,您没有指定权限(主机)。因此,您的重定向会发送一个302 FoundHTTP 状态,并且响应包含一个location:如下所示的标头:

location: /html/index.html

这是一个相对URI,相对于发起重定向请求的当前 URI。这意味着它继承了请求页面的方案和权限组件(显然,在您的情况下,它是一个http://localhost:xx/....

要解决此问题,请UriBuilder在其构造函数中使用HttpContext.Current.Request.Url. 那应该这样做:

UriBuilder ub = new UriBuilder( HttpContext.Current.Request.Url );
ub.Path   = "/html/index.html";
Response.Redirect(ub.Uri.ToString(), true);
于 2013-12-16T20:45:15.457 回答