2011-02-09 16 views
37

Devo reindirizzare il mio sito HTTP a HTTPS, ho aggiunto sotto la regola ma ottengo 403 Errore quando provo usando http://www.example.com, funziona bene quando digito https://www.example.com in browser.Come reindirizzare HTTP a HTTPS nell'applicazione 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

Sotto regola? Cosa intendi? –

+0

Ho aggiunto la regola utilizzando il modulo "URL rewirte" in IIS e quello era in web.config. – LLM

risposta

99

Puoi farlo in codice:

Global.asax.cs

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

o si potrebbe aggiungere lo stesso codice per un filtro d'azione:

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

Ho provato lo stesso errore 403 stesso proibito. – LLM

+0

Spostando la mia logica di reindirizzamento su Application_BeginRequest() ho risolto un problema relativo a dove stavo tentando di eseguire un reindirizzamento basato sull'URL digitato. – farina

+0

Application_BeginRequest() ha funzionato perfettamente per me, grazie. –

3

I utilizzare quanto segue in Global.asax:

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

ho fatto questa convenzione, dal momento che una sessione di debug locale usa numeri di porta personalizzato:

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://")); 
      } 
     } 
    } 

Preferibilmente ci sarebbe qualche modo per ottenere l'URL e l'URL SSL a livello di codice ...

2

Si potrebbe usare RequireHttpsAttribute per casi semplici.

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

Come indicato in MSDN ...

"rappresenta un attributo che impone una richiesta HTTP non protetta essere reinvio tramite HTTPS".

RequireHttpsAttribute

non sono sicuro che ci si vuole usare questo per far rispettare HTTPS attraverso un grande sito però. Un sacco di decorazioni da fare e opportunità di perdere i controller.

+1

non funziona se si dispone di childactions (renderaction) ;-) – juFo

+0

Buon posto, che cosa fa in questo caso? – Nattrass

+0

Basta crash. "Le azioni secondarie non sono autorizzate a eseguire azioni di reindirizzamento." "Dettagli eccezione: System.InvalidOperationException: le azioni figlio non possono eseguire azioni di reindirizzamento." – juFo

3

This post spiega molto bene come reindirizzare tutte le richieste su HTTPS.

15

Nella Global.asax.cs:

semplice reindirizzamento

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 redirect (SEO migliori pratiche)

Il 301 Moved Permanently reindirizzamento è considerato una best practice per l'aggiornamento gli utenti da HTTP a HTTPS (see Google recommendations).

Quindi, se verrà reindirizzato troppo Google o Bing robot, considerare questo:

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

Dovrebbe essere selezionato rispondere IMO, non che mi aspetto che OP ritorni dopo 5 anni. – Sinjai

+0

@Matthieu Charbonnier Grazie mille –

+2

Sono d'accordo con il post qui sopra - questa dovrebbe essere selezionata risposta –

Problemi correlati