如何在使用相对URL时更改http / https协议

时间:2011-07-08 19:49:21

标签: c# asp.net https http-headers

协议相对URL 不是我正在寻找的东西。我正在寻找一种绝对指定协议(http vs https)的方法,同时保持url相对的主机名。

给定一个相对URL,例如“/ SearchForStuff”,我希望能够指定不同的协议“https vs. http”等,而无需指定主机/域名。

我们的网站有一个标题局部视图,我们在网站的每个页面的顶部显示。网站上的某些页面是http,有些是https。标题包含用于站点范围搜索的文本框和按钮。网站搜索结果页面始终使用http提供,因此我们希望表单操作指向相对路径“/ find”。但是,我们希望在我们的许多内部测试服务器(10.10.10.123等)以及面向公众的服务器(“www.publicfacingserver.com”)上使用相同的标头,理想情况下不会更改标题局部视图的内容。所以我正在寻找的是一种为搜索操作指定协议同时保持服务器/主机名相对的方法。

目前,为了确保用户无法从安全页面链接到站点搜索结果的安全页面,我们会对用于站点搜索的操作的绝对URL进行硬编码,并完成协议和主机名,例如“http://www.publicsite.com/find”。问题是在测试服务器上单击该操作会将您重定向回我们的面向公众的网站。因此,对于测试,我们对主机文件进行手动编辑,以使测试服务器的IP地址等于我们面向公众的站点名称。这给开发人员带来了一些认知负担,并且还要求我们访问我们希望测试我们网站的任何非编码人员的计算机,以便在测试之前配置他们的主机文件,并在测试之后取消配置更改其主机文件。

以下代码是我提出的最佳解决方案。有谁知道更好的方法?如果我的解决方案足够,它是否会产生任何安全漏洞?我不明白它是怎么回事,因为如果恶意用户向我们面向IP地址X的公众发送请求但主机头中的主机名与该IP地址不匹配,这只会导致URL不稳定被提供给同一个用户。换句话说,我没有看到任何人可以通过在另一个网站上的留言板上发布URL或任何类似的东西来使用它来创建XSRF漏洞:

public static string CurrentHostName(this UrlHelper helper, HttpProtocol protocol)
{
    var result = string.Empty;

    if (protocol == HttpProtocol.Secure) result += "https://";
    if (protocol == HttpProtocol.UnSecure) result += "http://";
    if (protocol == HttpProtocol.Current) result += HttpContext.Current.Request.Url.Scheme;

    result += HttpContext.Current.Request.Url.Host;

    if (HttpContext.Current.Request.Url.Port != 80) result += ":" + HttpContext.Current.Request.Url.Port.ToString();

    return result;
}

HttpProtocol是我自己创建的枚举。

谢谢!

2 个答案:

答案 0 :(得分:1)

我认为您要求的是主机相对而非协议相对的网址格式。我不认为使用任何标准网址格式是可能的。例如,http:/ path / filename不适用于此。

答案 1 :(得分:0)

警告:http:/ path / filename在不同浏览器上的解释不同。

Firefox将路径解释为路径,但其他浏览器将“ path”解释为服务器名。