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

11

协议相对的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”。问题在于,点击来自测试服务器的该操作会将您重定向回我们的公共服务器。因此,为测试,我们需要手动编辑我们的hosts文件以使测试服务器的IP地址等于我们的公共站点名称。这对我们开发人员来说增加了一些认知负担,并且还要求我们访问任何非编码人员的计算机,以在测试之前配置其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是我自己创建的一个枚举类型。

谢谢!


你可不可以创建一个名为 HOSTapp_config 变量,在 LIVE/DEV 上进行更改呢? - Chris Haas
2个回答

1

我认为您正在寻找一种主机相对而不是协议相对的URL格式。我认为使用任何标准的URL格式都不可能实现这一点。例如,http:/path/filename无法实现此目的。


我在问题中粘贴的代码片段似乎对我们有效。你觉得它合理吗?你看到其中有任何逻辑或安全漏洞吗?谢谢! - user74754
当然,使用脚本(客户端或服务器端)构建完全合格的URL将非常有效。 - EricLaw
在成功地在各种服务器环境中使用了所需的代码片段之后,它对我们来说运行良好,因此我会说你的答案总结为“不能使用URL格式,但是你的代码片段应该可以工作”是正确的。 - user74754

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接