Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在使用相对URL时更改http/https协议_C#_Asp.net_Https_Http Headers - Fatal编程技术网

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

C# 如何在使用相对URL时更改http/https协议,c#,asp.net,https,http-headers,C#,Asp.net,Https,Http Headers,协议相关URL不是我想要的。我正在寻找一种绝对指定协议(http vs https)的方法,同时保持url的主机名相对 给定一个相对URL,如“/SearchForStaff”,我希望能够指定不同的协议“https vs.http”等,而不必指定主机/域名 我们的站点有一个标题部分视图,我们在站点的每个页面顶部都显示该视图。网站上的一些页面是http,一些是https。标题包含用于站点范围搜索的文本框和按钮。站点搜索结果页面始终使用http提供,因此我们希望表单操作指向相对路径“/find”。但

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

给定一个相对URL,如“/SearchForStaff”,我希望能够指定不同的协议“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是我自己创建的枚举


谢谢

我认为您要求的是与主机相关的URL格式,而不是与协议相关的URL格式。我认为这不可能使用任何标准的url格式。例如,http:/path/filename对此不起作用。

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


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

难道你不能创建一个名为
HOST
(或其他)的app_配置变量,并在LIVE/DEV上更改它吗?我在问题中粘贴的代码片段似乎对我们有用。你觉得这合理吗?你看到它有什么逻辑或安全漏洞吗?谢谢当然,使用脚本(客户端或服务器)来构建完全限定的URL会很好。在使用的代码片段成功地适应了各种服务器环境之后,它对我们来说很好,所以我要说,您的回答概括为:“使用URL格式是不可能的,但是您的代码片段应该可以工作。”这是正确的。