0

我的要求是将用户从旧 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 { get; set; }


    [Required(ErrorMessage = "New url is required.")]
    [MaxLength(1000)]
    //[Url]
    [Display (Name = "New Url")]
    public string NewUrl { get; set; }

}

对 URL 进行了注释,以便我可以在 localhost 中工作。

因此,当请求旧 url 时,我希望将请求转移到新 url 为了在 Application_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会导致无限循环

那么如何防止多次重定向。例如,我请求http://localhost:80/mypage并且我已将其新 url 设置为http://localhost:80/home然后当请求 mypage 时,它​​应该重定向到小写的家庭制作 url,并且重定向应该只发生一个时间。

笔记

  1. 我只需要在我自己的域内重定向。
  2. 用户将为旧 URL 和新 URL 输入完整的 URL 地址。

更新

在@RobertHarvey 的一些提示下,我修改了我的代码,如下所示,这对我有用

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

虽然我仍然相信更新的实现有一些限制。我将不胜感激任何进一步的代码增强和案例覆盖。

4

1 回答 1

0

你的两个“笔记”是矛盾的。如果您只想在您的域内允许重定向,那么记录完整的 URL(包括域)是完全没有必要的,只会使事情复杂化。使旧/新 URL 只是绝对路径。这也解决了您在开发与生产中工作的问题,因为您无需担心数据在正确的环境中具有正确的域。

注意:您的无限重定向是您代码中的错误。您应该重定向到newUrl,而不是lowercaseUrl。在 wherenewUrl为 null 的情况下,没有重定向,因此在这种情况下您根本不应该重定向。

于 2017-07-05T17:57:37.390 回答