如何改变http/https协议,而使用相对URL

本文关键字:协议 URL 相对 https 何改变 改变 http | 更新日期: 2023-09-27 18:01:31

协议相关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地址的hosts文件进行手动编辑,使其与我们面向公众的站点名称相等。这给我们作为开发人员带来了一点认知负担,并且还要求我们访问任何我们希望测试我们站点的非编码人员的计算机,以便在测试之前配置他们的hosts文件,并在测试后取消配置对他们的hosts文件的更改。

下面的代码是我想到的最好的解决方案。有人知道更好的方法吗?如果我的解决方案足够,它是否会产生任何安全漏洞?我看不出它是怎么做到的,因为如果一个恶意用户伪造了一个请求到我们面向公众的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是一个我自己创建的enum。

谢谢!

如何改变http/https协议,而使用相对URL

我想你要求的URL格式是host相对的,而不是protocol相对的。我不认为使用任何标准的url格式是可能的。例如,http:/path/filename不适用于此

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

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