C# 重定向到MVC 5中动态添加的URL
我的要求是将用户从旧url重定向到新url。我的实体如下:C# 重定向到MVC 5中动态添加的URL,c#,asp.net-mvc,asp.net-mvc-5,mvcroutehandler,C#,Asp.net Mvc,Asp.net Mvc 5,Mvcroutehandler,我的要求是将用户从旧url重定向到新url。我的实体如下: public class HttpRedirect { [Key] public int Id { get; set; } [Required(ErrorMessage = "Old url is required.")] [MaxLength(1000)] //[Url] [Display(Name = "Old Url")] public string OldUrl { ge
public class HttpRedirect
{
[Key]
public int Id { get; set; }
[Required(ErrorMessage = "Old url is required.")]
[MaxLength(1000)]
//[Url]
[Display(Name = "Old Url")]
public string OldUrl { get; set; }
[Required(ErrorMessage = "New url is required.")]
[MaxLength(1000)]
//[Url]
[Display (Name = "New Url")]
public string NewUrl { get; set; }
}
Url已注释,以便我可以在localhost中工作
所以当请求旧的url时,我希望请求被转移到新的url
为了在应用程序_BeginRequest事件中的global.asax文件中实现这一点,我有以下代码
protected void Application_BeginRequest(object sender, EventArgs e)
{
//You don't want to redirect on posts, or images/css/js
bool isGet = HttpContext.Current.Request.RequestType.ToLowerInvariant().Contains("get");
if (isGet && HttpContext.Current.Request.Url.AbsolutePath.Contains(".") == false)
{
string lowercaseURL = (Request.Url.Scheme + "://" + HttpContext.Current.Request.Url.Authority + HttpContext.Current.Request.Url.AbsolutePath);
string newUrl = new HttpRedirectRepository().RedirectUrl(lowercaseURL);
if(newUrl != null)
{
lowercaseURL = newUrl;
}
lowercaseURL = lowercaseURL.ToLower().Trim() + HttpContext.Current.Request.Url.Query;
Response.Clear();
Response.Status = "301 Moved Permanently";
Response.AddHeader("Location", lowercaseURL);
Response.End();
}
}
我已经实现了上面的代码来完成2个任务。
1.将url更改为小写
2.如果新url可用于请求的url,请重定向到该url
在我上面的实现中,我强烈地感觉到它正在工作,但通过重定向到小写字母会导致无限循环
那么,如何防止多重重定向呢。例如。
我请求并且我已经将它的新url设置为,当请求mypage时,它应该重定向到小写的自制url,并且重定向应该只发生一次
注意
protected void Application_BeginRequest(object sender, EventArgs e)
{
//You don't want to redirect on posts, or images/css/js
bool isGet = HttpContext.Current.Request.RequestType.ToLowerInvariant().Contains("get");
if (isGet && HttpContext.Current.Request.Url.AbsolutePath.Contains(".") == false)
{
bool redirect = false;
string requestUrl = (Request.Url.Scheme + "://" + HttpContext.Current.Request.Url.Authority + HttpContext.Current.Request.Url.AbsolutePath);
//You don't want to change casing on query strings
string newUrl = new HttpRedirectRepository().RedirectUrl(requestUrl);
if (newUrl != null)
{
requestUrl = newUrl;
redirect = true;
}
if (Regex.IsMatch(requestUrl, @"[A-Z]"))
{
requestUrl = requestUrl.ToLower().Trim() + HttpContext.Current.Request.Url.Query;
redirect = true;
}
if (redirect)
{
Response.Clear();
Response.Status = "301 Moved Permanently";
Response.AddHeader("Location", requestUrl);
Response.End();
}
}
}
尽管如此,我仍然相信更新的实现有一些局限性。我将感谢任何进一步的代码增强和案例覆盖 你的两个“注释”相互矛盾。如果您只想在域内允许重定向,那么记录完整的URL(包括域)是完全不必要的,而且只会使事情变得复杂。将旧/新URL设置为绝对路径。这也解决了您在开发和生产环境中工作的问题,因为您不需要担心数据在正确的环境中具有正确的域
注意:无限重定向是代码中的一个bug。您应该重定向到
newUrl
,而不是lowercaseUrl
。如果newUrl
为空,则不存在重定向,因此在这种情况下,您完全不应该重定向。无限循环意味着,您的主控制器多次被调用?@SivaGopal yes,因为对重定向的url也会执行beginrequest,该url也会通过添加响应头位置来响应,这会导致另一个重定向,并且此过程一直在进行。我遇到类似的情况,比如写Response.Redirect(“~/Home.aspx”)在Home.aspx页面加载事件中。您是否可以简单地添加一个阻止第二次重定向的if
条件?您是否可以显示一些您在Home.aspx中正在执行的操作的示例代码?@RobertHarvey我试图通过在会话中写入url来执行此操作,但在处理begin请求时会话对象不可用。所以我想我需要在begin请求中引入一些变量。这如何解决他的无限重定向问题?@Chris Pratt用户添加完整url比添加协议和域名以外的内容更容易。虽然我们可以从完整的ur获取绝对url。使用绝对url时,事情将如何进行?重定向不需要完整的url。只需重定向到路径,就会假定当前域和协议。