2011-02-09 23 views
37

Necesito redirigir mi sitio HTTP a HTTPS, he agregado la regla siguiente pero obtengo 403 Error al intentar usar http://www.example.com, funciona bien cuando escribo https://www.example.com en navegador.Cómo redirigir HTTP a HTTPS en la aplicación MVC (IIS7.5)

<system.webServer> 
    <rewrite> 
     <rules> 
      <rule name="HTTP to HTTPS redirect" stopProcessing="true"> 
       <match url="(.*)" /> 
       <conditions> 
        <add input="{HTTPS}" pattern="off" ignoreCase="true" /> 
       </conditions> 
       <action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}/{R:1}" /> 
      </rule> 
     </rules> 
    </rewrite> 
</system.webServer> 
+0

A continuación regla? ¿Qué quieres decir? –

+0

He agregado una regla usando el módulo "URL rewirte" en IIS y estaba en web.config. – LLM

Respuesta

99

Puede hacerlo en código:

Global.asax.cs

protected void Application_BeginRequest(){ 
    if (!Context.Request.IsSecureConnection) 
     Response.Redirect(Context.Request.Url.ToString().Replace("http:", "https:")); 
} 

O Se podría añadir el mismo código para un filtro de acción:

public class SSLFilter : ActionFilterAttribute { 

    public override void OnActionExecuting(ActionExecutingContext filterContext){ 
     if (!filterContext.HttpContext.Request.IsSecureConnection){ 
      var url = filterContext.HttpContext.Request.Url.ToString().Replace("http:", "https:"); 
      filterContext.Result = new RedirectResult(url); 
     } 
    } 
} 
+0

He intentado lo mismo pero el mismo error prohibido 403. – LLM

+0

Moviendo mi lógica de redirección a Application_BeginRequest() resolví un problema que tenía cuando intentaba hacer un redireccionamiento basado en la URL tipada. – farina

+0

Application_BeginRequest() funcionó perfectamente para mí, gracias. –

3

I utilice lo siguiente en Global.asax:

protected void Application_BeginRequest() 
{ 
    if (FormsAuthentication.RequireSSL && !Request.IsSecureConnection) 
    { 
    Response.Redirect(Request.Url.AbsoluteUri.Replace("http://", "https://")); 
    } 
} 
1

lo hice thusly, ya que una sesión de depuración local utiliza números de puerto personalizado:

protected void Application_BeginRequest() 
    { 
     if (!Context.Request.IsSecureConnection) 
     { 
      if (HttpContext.Current.Request.IsLocal) 
      { 
       Response.Redirect(Context.Request.Url.ToString().Replace("http://localhost:25885/", "https://localhost:44300/")); 
      } 
      else 
      { 
       Response.Redirect(Context.Request.Url.ToString().Replace("http://", "https://")); 
      } 
     } 
    } 

Preferiblemente habría alguna manera de obtener la URL y URL SSL mediante programación ...

2

Usted podría utilizar RequireHttpsAttribute para casos simples.

[RequireHttps] 
public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

Como se indica en MSDN ...

"representa un atributo que obliga a una solicitud HTTP no segura para ser re-envía a través de HTTPS."

RequireHttpsAttribute

no estoy seguro de que quiere usar esto para cumplir HTTPS a través de un sitio grande sin embargo. Un montón de decoración para hacer, y la oportunidad de perder controladores.

+1

no funciona si tiene childactions (renderaction) ;-) – juFo

+0

Buen lugar, ¿qué hace en ese caso? – Nattrass

+0

Sólo falla. "Las acciones secundarias no pueden realizar acciones de redirección." "Detalles de la excepción: System.InvalidOperationException: las acciones secundarias no pueden realizar acciones de redirección." – juFo

3

This publicación explica muy bien cómo redirigir todas las solicitudes a HTTPS.

15

En el Global.asax.cs:

redirección simple

protected void Application_BeginRequest() 
{ 
    if (!Context.Request.IsSecureConnection 
     && !Context.Request.Url.ToString().StartsWith("http://localhost:") // to avoid switching to https when local testing 
     ) 
    { 
     // Only insert an "s" to the "http:", and avoid replacing wrongly http: in the url parameters 
     Response.Redirect(Context.Request.Url.ToString().Insert(4, "s")); 
    } 
} 

301 redirigir (mejores prácticas SEO)

La redirección 301 Moved Permanently se considera una buena práctica para la actualización de los usuarios de HTTP a HTTPS (see Google recommendations).

Así que si Google o Bing robots serán redirigidos también, considere esto:

protected void Application_BeginRequest() 
{ 
    if (!Context.Request.IsSecureConnection 
     && !Context.Request.Url.ToString().StartsWith("http://localhost:") // to avoid switching to https when local testing 
     ) 
    { 
     Response.Clear(); 
     Response.Status = "301 Moved Permanently"; 
     Response.AddHeader("Location", Context.Request.Url.ToString().Insert(4, "s")); 
     Response.End(); 
    } 
} 
+2

Debe seleccionarse responder a IMO, no es que espere que OP regrese después de 5 años. – Sinjai

+0

@Matthieu Charbonnier Muchas gracias –

+2

Estoy de acuerdo con la publicación anterior: esta debe ser seleccionada respuesta –

Cuestiones relacionadas