Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.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# 将HTTPS页面上的URL重写为HTTP_C#_Asp.net_Https_Url Rewriting_Iis 7.5 - Fatal编程技术网

C# 将HTTPS页面上的URL重写为HTTP

C# 将HTTPS页面上的URL重写为HTTP,c#,asp.net,https,url-rewriting,iis-7.5,C#,Asp.net,Https,Url Rewriting,Iis 7.5,使用IIS7的“绑定”功能,我在我的网站根目录中将SSL证书添加到“https”(端口443)。然后,我需要一个特定目录“/secure directory/”的SSL连接。我现在可以通过显式链接到https地址重定向到此目录:。问题是,/secure directory/是我想要使用SSL的唯一目录,它包含导航链接,这些链接现在维护https前缀,因此我的“Home”链接现在指向,而不是 为/secure目录/中的链接保留http前缀的理想方法是什么?我有IIS7 URL重写模块,因此如果有人

使用IIS7的“绑定”功能,我在我的网站根目录中将SSL证书添加到“https”(端口443)。然后,我需要一个特定目录“/secure directory/”的SSL连接。我现在可以通过显式链接到https地址重定向到此目录:。问题是,/secure directory/是我想要使用SSL的唯一目录,它包含导航链接,这些链接现在维护https前缀,因此我的“Home”链接现在指向,而不是


为/secure目录/中的链接保留http前缀的理想方法是什么?我有IIS7 URL重写模块,因此如果有人可以共享出站规则,那将非常感谢。否则,我想知道我是否完全错误地处理了这个问题,或者是否有比重写规则更好的解决方案。谢谢。

这不是URL重写问题,依我看。但至少在理论上(POC时间?),您可以编写另一个重写规则,返回到非SSL。然而,重写场景的可伸缩性并不是很好,因为它会在一个人每次翻转时强制执行两次点击。这可能是问题,也可能不是问题,取决于应用程序的正常使用

处理此问题的一个简单方法是覆盖菜单控件,以便您能够尊重配置。这意味着菜单对其他实现使用绝对链接(非SSL时,SSL使用绝对链接,反之亦然)

如果您需要更多的“工业实力”,请考虑将HTTP处理程序添加到“管道”中,并在其中控制SSL或非SSL。我将彻底地介绍这一点,这样你就不会重新发明轮子(不是这里发明的综合症),并试图使其成为一个可重用的抽象。这有点复杂,但当您移动到另一个解决方案时,重复这一过程可能会更简单。我会先看看是否有人像这样开源处理程序,因为这不是一个罕见的问题


我相信还有其他的方法来看待这个问题。

这不是一个URL重写问题,依我看。但至少在理论上(POC时间?),您可以编写另一个重写规则,将其翻转回非SSL。然而,重写场景的可伸缩性并不是很好,因为它会在一个人每次翻转时强制执行两次点击。这可能是问题,也可能不是问题,取决于应用程序的正常使用

处理此问题的一个简单方法是覆盖菜单控件,以便您能够尊重配置。这意味着菜单对其他实现使用绝对链接(非SSL时,SSL使用绝对链接,反之亦然)

如果您需要更多的“工业实力”,请考虑将HTTP处理程序添加到“管道”中,并在其中控制SSL或非SSL。我将彻底地介绍这一点,这样你就不会重新发明轮子(不是这里发明的综合症),并试图使其成为一个可重用的抽象。这有点复杂,但当您移动到另一个解决方案时,重复这一过程可能会更简单。我会先看看是否有人像这样开源处理程序,因为这不是一个罕见的问题

我确信还有其他的方法来看待这个问题。

我正在使用。您可以将/secure directory/配置为仅通过https访问

<secureWebPages>
    <directories>
        <add path="secure-directory" />
    </directories>
</secureWebPages>

我正在使用。您可以将/secure directory/配置为仅通过https访问

<secureWebPages>
    <directories>
        <add path="secure-directory" />
    </directories>
</secureWebPages>

我通常使用这样的东西,它一直对我有用。(但并不完全确定这是最好的方式)

您可以在global.asax中使用类似的函数,并可以调用应用程序\u BeginRequest

private void RedirectToCorrectSSLScheme()
    {
        Uri pageRequest = Request.Url;
        string requestPath = pageRequest.GetLeftPart(UriPartial.Path).ToLower();

        requestPath = Server.UrlDecode(requestPath);
        // PageIsSecure returns if the given page should be secure or not. I 
       //maintain a list of secure pages or 
       //secure directory in an XML config.  
        bool securePage = GetSecurePages().PageIsSecure(requestPath);
        if (pageRequest.Scheme == "https" && !securePage && requestPath.Contains(".aspx"))
        {
            Response.Redirect("http://" + pageRequest.Host + pageRequest.PathAndQuery, true);
        }
        else if (pageRequest.Scheme == "http" && securePage && requestPath.Contains(".aspx"))
        {
            Response.Redirect("https://" + pageRequest.Host + pageRequest.PathAndQuery, true);
        }
    }

我通常使用这样的东西,它一直对我有效。(但并不完全确定这是最好的方式)

您可以在global.asax中使用类似的函数,并可以调用应用程序\u BeginRequest

private void RedirectToCorrectSSLScheme()
    {
        Uri pageRequest = Request.Url;
        string requestPath = pageRequest.GetLeftPart(UriPartial.Path).ToLower();

        requestPath = Server.UrlDecode(requestPath);
        // PageIsSecure returns if the given page should be secure or not. I 
       //maintain a list of secure pages or 
       //secure directory in an XML config.  
        bool securePage = GetSecurePages().PageIsSecure(requestPath);
        if (pageRequest.Scheme == "https" && !securePage && requestPath.Contains(".aspx"))
        {
            Response.Redirect("http://" + pageRequest.Host + pageRequest.PathAndQuery, true);
        }
        else if (pageRequest.Scheme == "http" && securePage && requestPath.Contains(".aspx"))
        {
            Response.Redirect("https://" + pageRequest.Host + pageRequest.PathAndQuery, true);
        }
    }

谢谢你的回复。我曾考虑实施global.asax和module解决方案,但最终最符合我需求的是出站重写规则。我可能会在以后重新讨论这个问题,并重新评估我的情况,但现在,这就是我正在使用的(1860端口已被移除用于生产):



(该模式防止在服务器端单击事件上重写,而(.*)将重写并破坏它们)

感谢您的回复。我曾考虑实施global.asax和module解决方案,但最终最符合我需求的是出站重写规则。我可能会在以后重新讨论这个问题,并重新评估我的情况,但现在,这就是我正在使用的(1860端口已被移除用于生产):


(该模式防止在服务器端单击事件上重写,而(*)将重写并中断这些事件)