我有以下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>
答案 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.Master
。 Site.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);
}
这个例子可能有点简单,但你应该能够得到一般的想法。