将HTTPS页面上的URL重写为HTTP

时间:2012-02-06 18:44:48

标签: c# asp.net https url-rewriting iis-7.5

使用IIS7的“绑定”功能,我在我的网站根目录下添加了一个SSL证书到“https”(端口443)。然后,我需要为特定目录'/ secure-directory /'建立SSL连接。我现在可以通过显式链接到https地址https://www.mysite.com/secure-directory/重定向到此目录。问题是/ secure-directory /是我想要使用SSL的唯一目录,它包含现在维护https前缀的导航链接,因此我的“主页”链接现在指向https://www.mysite.com而不是{{ 3}}。

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

4 个答案:

答案 0 :(得分:2)

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

进行访问
<secureWebPages>
    <directories>
        <add path="secure-directory" />
    </directories>
</secureWebPages>

答案 1 :(得分:2)

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

您可以在 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);
        }
    }

答案 2 :(得分:0)

这不是URL重写问题,IMO。但是,至少在理论上(POC时间?),您可以编写另一个重写为非SSL的重写规则。然而,重写场景不具有可扩展性,因为每次翻转时它都会强制两次点击。这可能是也可能不是问题,取决于应用程序的正常使用。

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

如果您需要更多“工业实力”,可以考虑在“管道”中添加HTTP处理程序,并在那里控制SSL或非SSL。我会彻底地完成这一步,所以你最终不会重新发明轮子(这里没有发明这种综合症),并试图让它成为一个可重复使用的抽象。这有点复杂,但当您转移到另一个解决方案时,最终可以更简单地重复。我会首先看一下是否有人开源这样的处理程序,因为这不是一个不寻常的问题。

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

答案 3 :(得分:0)

感谢您的回复。我考虑过实现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>

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