协议相对的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是我自己创建的一个枚举类型。
谢谢!
HOST
的app_config
变量,在 LIVE/DEV 上进行更改呢? - Chris Haas