如果通过HTTP请求,我需要确保我网站上的所有流量都重定向到HTTPS。当我们将站点部署到appharbor时,我们使用自定义的RequireHttpsAttribute,它适用于我们的MVC控制器。
但是,我们还希望通过HTTP强制将任何静态文件(图像,样式表,javascript)请求发送到HTTPS。由于负载均衡器将https请求作为http发送到Web服务器,因此使用web.config重写规则进行尝试最终会出现重定向循环。
有没有人对如何实现这个有任何想法?
答案 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);
}
}