我的要求是将用户从旧 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,并且重定向应该只发生一个时间。
笔记
- 我只需要在我自己的域内重定向。
- 用户将为旧 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();
}
}
}
虽然我仍然相信更新的实现有一些限制。我将不胜感激任何进一步的代码增强和案例覆盖。