URL将HTTP重写为HTTPS,但现在向后重写

时间:2011-04-02 02:10:36

标签: iis iis-7 asp.net-mvc-3 url-rewriting

我有以下UrlRewrite代码可以在网址中从http更改为https,但现在我需要将其从https更改回http

例如,当我从“帐户/登录”页面重定向到主页时。

以下是我的重写规则:

<rewrite>
   <rules>
      <rule name="RequiresHTTPS-Redirect" stopProcessing="true">
        <match url="(.+)" />
        <conditions>
          <add input="{HTTPS}" pattern="off" />
          <add input="{RequiresHTTPS:{R:1}}" pattern="(.+)" />
        </conditions>
        <action type="Redirect" url="https://{HTTP_HOST}/{C:1}"
                appendQueryString="true" redirectType="Found" />
      </rule>
   </rules>
   <rewriteMaps>
       <rewriteMap name="RequiresHTTPS">
           <add key="Account/LogOn" value="Account/LogOn" />
       </rewriteMap>
   </rewriteMaps>
</rewrite>

2 个答案:

答案 0 :(得分:2)

将逻辑重定向到登录页面本身的非https页面。从https重定向到http的问题是浏览器在获得重定向之前仍然会首先启动到https url的ssl连接,所以它有点没用。

答案 1 :(得分:1)

这里有几个场景:

<强> 1。所有内容均受网络表单<authorization>保护:

您的用户正在访问登录页面,因为他们浏览了使用<authorization>元素保护的网站的一部分。如果是这种情况,您将在查询字符串中传递给您的返回URL:ReturnUrl。您可以使用以下方式将用户重新定向到没有SSL的位置:

return Redirect("http://" + Request.Url.Host + returnUrl);

<强> 2。用户必须登录才能启用其他功能:

您的用户正在点击“登录”链接,以启用一些额外的功能,如果他们未登录,则会在您的网页上进行裁剪。例如,能够发布论坛消息或查看高级内容。

在这种情况下,您可以在登录登录页面之前跟踪他们的位置。此示例基于您在创建新的MVC3应用程序时使用Visual Studio 2010获得的模板应用程序(您可能已将其用作项目的模板)。

在该示例应用程序中,每个页面都使用母版页Site.MasterSite.Master执行Html.RenderPartial("LogOnUserControl")以在每个页面上呈现登录链接。打开LogOnUserControl.ascx并将登录ActionLink的代码更改为:

else
{
    if(!Request.RawUrl.Contains("/Account/LogOn"))
    {
        Session["WhereWasI"] = Request.Url.AbsoluteUri;
    }
%> 
    [ <%: Html.ActionLink("Log On", "LogOn", "Account") %> ]
<%
}

如果用户未登录,我们基本上是在跟踪用户所在的页面。由于Logon链接也在登录页面上呈现,我们需要将其排除,因此if语句:

if(!Request.RawUrl.Contains("/Account/LogOn"))

然后,在AccountController.cs Logon回发操作方法中,您可以将用户返回到他们在网站上的位置,但使用http代替https:

如果ASP.NET Forms身份验证提供returnUrl,我还会将重定向包含到非SSL中:

public ActionResult LogOn(LogOnModel model, string returnUrl)
{
  if (ModelState.IsValid)
  {
    if (MembershipService.ValidateUser(model.UserName, model.Password))
    {
      FormsService.SignIn(model.UserName, model.RememberMe);
      if (Url.IsLocalUrl(returnUrl))
      {
        //
        // 1. All content is protected by web forms `<authorization>`:
        // If there was a return URL then go back there
        //
        if(!String.IsNullOrWhiteSpace(returnUrl))
        {
          return Redirect("http://" + Request.Url.Host + returnUrl);
        }
      }
      else
      {
        //
        // 2. Users have to logon to enable additional features:
        // 
        if (Session["WhereWasI"] != null)
        {
          return Redirect(
             Session["WhereWasI"].ToString().Replace("https", "http"));
        }

        return RedirectToAction("Index", "Home");
      }
    }
    else
    {
      ModelState.AddModelError("", 
            "The user name or password provided is incorrect.");
    }
  }

  // If we got this far, something failed, redisplay form
  return View(model);
}

这个例子可能有点简单,但你应该能够得到一般的想法。