如何在MVC应用程序中将HTTP重定向到HTTPS(IIS7.5)

时间:2011-02-09 14:04:05

标签: asp.net-mvc http redirect https

我需要将我的HTTP站点重定向到HTTPS,添加了下面的规则,但是当我尝试使用http://www.example.com时遇到403错误,当我在浏览器中键入https://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>

11 个答案:

答案 0 :(得分:108)

您可以在代码中执行此操作:

的Global.asax.cs

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

或者您可以将相同的代码添加到操作过滤器:

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

答案 1 :(得分:40)

Global.asax.cs

简单重定向

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重定向:SEO最佳实践(搜索引擎优化)

301 Moved Permanently重定向状态响应代码被视为将用户从HTTP升级到HTTPS(see Google recommendations)的最佳做法。

因此,如果Google或Bing机器人也会被重定向,请考虑以下事项:

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

答案 2 :(得分:6)

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

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

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

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

如MSDN中所述......

  

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

RequireHttpsAttribute

我不确定您是否希望使用此功能在大型网站上强制执行HTTPS。很多装饰要做,也有机会错过控制器。

答案 5 :(得分:2)

这很简单。只需在“ Global.asax”文件中添加一行,如下所示:

protected void Application_Start()
{
    GlobalFilters.Filters.Add(new RequireHttpsAttribute(true));
}

如果您只想应用服务器端而不是本地,请应用以下代码:

protected void Application_Start()
{
   if (!HttpContext.Current.Request.IsLocal)
         GlobalFilters.Filters.Add(new RequireHttpsAttribute(true));
}

希望它会对您有所帮助:)谢谢!

答案 6 :(得分:1)

仅在网站在服务器上吃午餐时才强制使用https,而在机器上运行网站进行开发时忽略它:

在Global.asax中:

您将需要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:"));
    }
}

答案 7 :(得分:1)

我在Web.config文件中具有以下ASP.NET MVC重写规则:

您可以使用web.config文件尝试此代码。如果您的URL是http://www.example.com,那么它将被重定向到该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>

答案 8 :(得分:0)

使用web.config文件中的以下代码将http://重定向到https://

 <configuration>
 <system.webServer>
 <rewrite>
 <rules>
 <rule name="HTTPS force" enabled="true" stopProcessing="true">
 <match url="(.*)" />
 <conditions>
 <add input="{HTTPS}" pattern="^OFF$" />
 </conditions>
 <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" />
 </rule>
 </rules>
 </rewrite>
 </system.webServer>
</configuration>

答案 9 :(得分:0)

此答案不完全适用于OP,但对于那些无法像我这样工作并且遇到过此问题的人(尽管我知道OP中存在403 not 404错误),如果您遇到此问题,请参考此答案而不是404:https://stackoverflow.com/a/6962829/5416602

请检查您的IIS中是否绑定了HTTP端口(80),而不仅仅是HTTPS端口(443)

答案 10 :(得分:0)

我无法添加评论,但认为此补充信息可能会对某人有所帮助。

我使用301永久重定向实现了Global.asax想法,并在IIS中将http绑定添加到该站点。在我记得取消选中“ SSL设置”中的“需要SSL”之前,它仍然给我403禁止。