如何将HTTPredirect到MVC应用程序中的HTTPS(IIS7.5)

我需要将我的HTTP站点redirect到HTTPS,添加了以下规则,但是当使用http://www.example.com尝试时出现了403错误,在浏览器中inputhttps://www.example.com时它工作正常。

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

你可以在代码中做到这一点:

的Global.asax.cs

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

或者你可以添加相同的代码到一个动作filter:

 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); } } } 

Global.asax.cs

简单的redirect

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

301redirect (SEO最佳实践)

301 Moved Permanentlyredirect被认为是将用户从HTTP升级到HTTPS的最佳实践( 请参阅Googlebuild议 )。

因此,如果Google或Bing机器人也将被redirect,请考虑以下事项:

 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(); } } 

我在Global.asax中使用以下内容:

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

我这样做,因为本地debugging会话使用自定义端口号:

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

最好有一些方法来获得URL和SSL URL编程…

对于简单的情况你可以使用RequireHttpsAttribute。

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

正如MSDN中所述…

“表示强制通过HTTPS重新发送不安全HTTP请求的属性。”

RequireHttpsAttribute

我不确定你是否会希望使用这个来在大型网站上执行HTTPS。 很多装饰要做,并有机会错过控制器。

这篇文章很好地解释了如何将所有请求redirect到HTTPS。