如何将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 Permanently
redirect被认为是将用户从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。