2016-04-18 8 views
0

У меня есть требование, чтобы весь трафик на моем сайте перенаправлялся на HTTPS, если он запрашивается через HTTP. Когда мы развертываем сайт в appharbor, мы используем пользовательский RequireHttpsAttribute, который хорошо работает для наших MVC-контроллеров.appharbor force HTTPS для статических файлов

Однако мы также хотим заставить любой запрос на статические файлы (изображения, таблицы стилей, javascript) через HTTP для отправки на HTTPS. Попытка его с помощью правил перезаписи web.config заканчивается в цикле переадресации из-за того, что балансировщик нагрузки отправляет https-запрос на веб-сервер в виде http.

Есть ли у кого-нибудь идеи о том, как этого достичь?

ответ

0

После получения ответа от поддержки appharbor одним из их предложений было реализовать код, аналогичный пользовательскому RequireHttpsAttribute для статических файлов. Итак, я создал класс под названием HttpRequestModule и настроил его для запуска для всех запросов (runAllManagedModulesForAllRequests установлен в true). Я смог заставить любые прямые запросы к URL-адресам HTTP перенаправляться на 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); 
    } 
}