web-dev-qa-db-fra.com

Comment rediriger HTTP vers HTTPS dans l'application MVC (IIS7.5)

J'ai besoin de rediriger mon site HTTP vers HTTPS, j'ai ajouté la règle ci-dessous mais je reçois une erreur 403 lorsque j'essaie d'utiliser http://www.example.com , cela fonctionne bien lorsque je tape https: // www .example.com dans le navigateur. 

<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>
48
LLM

J'utilise le suivant dans Global.asax:

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

Vous pouvez le faire dans le code:

Global.asax.cs

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

Ou vous pouvez ajouter le même code à un filtre d'action:

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);
        }
    }
}
108
Chris Kooken

Dans le Global.asax.cs:

Simple redirect

protected void Application_BeginRequest()
{
    if (!Context.Request.IsSecureConnection
        && !Context.Request.IsLocal // 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: meilleures pratiques en matière de référencement (optimisation pour les moteurs de recherche)

Le code de réponse de statut de redirection 301 Moved Permanently est considéré comme une pratique recommandée pour la mise à niveau des utilisateurs de HTTP à HTTPS ( voir recommandations Google ). 

Donc, si les robots Google ou Bing seront également redirigés, considérez ceci:

protected void Application_BeginRequest()
{
    if (!Context.Request.IsSecureConnection
        && !Context.Request.IsLocal // 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();
    }
}
36

Vous pouvez utiliser RequireHttpsAttribute pour des cas simples. 

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

Comme indiqué dans MSDN ...

"Représente un attribut qui force une demande HTTP non sécurisée à être Renvoyée via HTTPS."

RequireHttpsAttribute

Je ne suis pas sûr que vous souhaitiez utiliser cela pour appliquer le protocole HTTPS sur un site volumineux. Il y a beaucoup de décoration à faire et l'occasion de rater des contrôleurs.

2
Nattrass

Je l'ai fait ainsi, car une session de débogage locale utilise des numéros de port personnalisés:

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

De préférence, il serait possible d'obtenir l'URL et l'URL SSL par programme ...

2
Paul Williams

J'ai la règle de réécriture ASP.NET MVC suivante dans le fichier Web.config:

Vous pouvez essayer ce code avec le fichier web.config. Si votre URL est http://www.example.com alors il sera redirigé vers cette URL https://www.example.com .

<system.webServer>
    <rewrite>
        <rules>
             <rule name="http to https" stopProcessing="true">
              <match url="(.*)" />
              <conditions>
               <add input="{HTTPS}" pattern="^OFF$" />
              </conditions>
              <action type="Redirect" url="https://{HTTP_Host}/{R:1}" redirectType="Permanent" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

1
Manish Kumar

Pour forcer https uniquement lorsque le site Web est créé sur le serveur et l'ignorer lors de l'exécution du site Web sur votre ordinateur à des fins de développement:

Dans Global.asax:

Vous aurez besoin de la méthode Application_BeginRequest ()

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
         // .....
    }

    //force https on server, ignore it on local machine
    protected void Application_BeginRequest()
    {
        if (!Context.Request.IsSecureConnection && !Context.Request.Url.ToString().Contains("localhost"))
            Response.Redirect(Context.Request.Url.ToString().Replace("http:", "https:"));
    }
}
1
Adel Mourad