appharbor强制HTTPS用于静态文件

时间:2016-04-18 00:16:49

标签: appharbor

如果通过HTTP请求,我需要确保我网站上的所有流量都重定向到HTTPS。当我们将站点部署到appharbor时,我们使用自定义的RequireHttpsAttribute,它适用于我们的MVC控制器。

但是,我们还希望通过HTTP强制将任何静态文件(图像,样式表,javascript)请求发送到HTTPS。由于负载均衡器将https请求作为http发送到Web服务器,因此使用web.config重写规则进行尝试最终会出现重定向循环。

有没有人对如何实现这个有任何想法?

1 个答案:

答案 0 :(得分:0)

收到appharbor支持的回复后,他们的一个建议是实现类似于静态文件的自定义RequireHttpsAttribute的代码。 所以我创建了一个名为HttpRequestModule的类,并将其设置为针对所有请求运行(runAllManagedModulesForAllRequests设置为true)我能够强制任何对HTTP URL的直接请求重定向到HTTPS。

class HttpRequestModule : IHttpModule
{
    public void Init(HttpApplication app)
    {
        app.BeginRequest += new EventHandler(CheckHttpRequest);
    }

    private void CheckHttpRequest(object sender, EventArgs a)
    {
        if (app.Context.Request.IsSecureConnection) return;

        if (app.Contact.Request.IsLocal) return;

        if (string.Equals(app.Context.Request.Headers["X-Forwarded-Proto"],
            "https",
            StringComparison.InvariantCultureIgnoreCase))
        {
            return;
        }

        var secureUrl = "https://" + app.Context.Request["HTTP_HOST"] + HttpContext.Current.Request.RawUrl;
        app.Context.Response.Redirect(secureUrl);
    }
}