将HTTPS页面上的URL重写为HTTP

本文关键字:URL 重写 HTTP HTTPS | 更新日期: 2023-09-27 18:23:46

使用IIS7的"bindings"功能,我在网站的根目录上将SSL证书添加到"https"(端口443)。然后,我需要一个特定目录"/secure directory/"的SSL连接。我现在可以通过显式链接到https地址重定向到此目录:https://www.mysite.com/secure-directory/.问题是/secure directory/是我唯一想使用SSL的目录,它包含的导航链接现在正在维护https前缀,所以我的"主页"链接现在指向https://www.mysite.com而不是http://www.mysite.com.

为/secure目录/中的链接保留http前缀的理想方式是什么?我有IIS7 URL重写模块,所以如果有人可以共享出站规则,那将不胜感激。否则,我想知道我是不是完全错了,或者有比重写规则更好的解决方案。谢谢

将HTTPS页面上的URL重写为HTTP

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

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

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

您可以在global.asax中使用类似的函数,并可以调用Application_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);
        }
    }

这不是URL重写问题,IMO。但是,至少在理论上(POC时间?),您可以编写另一个重写规则,该规则将返回到非SSL。然而,重写场景并没有那么可扩展,因为它迫使一个人每次翻转两次。根据应用程序的正常使用情况,这可能是问题,也可能不是问题。

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

如果您需要更"工业实力"的东西,可以考虑在"管道"中添加一个HTTP处理程序,并在那里控制SSL或非SSL。我会彻底地了解这一点,这样你就不会最终重新发明轮子(这里没有发明综合症),并试图使其成为一个可重复使用的抽象。这有点复杂,但当你转向另一个解决方案时,重复起来可能会更简单。我会先看看是否有人开源了这样的处理程序,因为这不是一个罕见的问题。

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

感谢您的回复。我考虑过实现global.asax和模块解决方案,但最终最符合我需求的是一个出站重写规则。我可能会在晚些时候重新审视这一点,并重新评估我的情况,但就目前而言,这就是我正在使用的(1860年的港口被拆除用于生产):

<rule name="ForceHttpsToHttp" preCondition="ResponseIsHtml1">
    <match filterByTags="A, Img" pattern="^(?!.*javascript).*$" />
        <conditions>
            <add input="{HTTPS}" pattern="ON" />
            <add input="{SERVER_PORT}" pattern="443" />
        </conditions>
    <action type="Rewrite" value="http://{HTTP_HOST}:1860{R:0}" />
</rule>

(该模式防止对服务器端点击事件进行重写,而(.*)会重写并破坏它们)