私の要件は、古いURLから新しいURLにユーザーをリダイレクトすることです。私の主体は以下の通りです:MVC 5の動的に追加された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; }
}
私はlocalhostで作業できるようにコメントされています。
旧URLは、私は要求がApplication_BeginRequestイベントでのGlobal.asaxファイルでこれを達成するために、新しい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)
{
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にリダイレクトします。私の上記の実装では
私は、どのように私は複数のリダイレクトを防ぐことができ、その作業ということが、lowercaseURL
にリダイレクトすることで無限ループを引き起こし、強い気持ちを持っています。例えば、 私はhttp://localhost:80/mypageを要求し、私は新しいURLをhttp://localhost:80/homeに設定しました。そして、mypageがリクエストされると、それは小文字でurlを作成してリダイレクトする必要があります。私は自分のドメイン内でリダイレクトする必要が
ノート
- 。
- ユーザーは、古いURLと新しいURLの両方に完全なURLアドレスを入力します。
UPDATE
まだ私が更新の実装は、いくつかの制限があると考えていますが、私
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();
}
}
}
のために働いている、次のように私は私のコードを変更した@RobertHarveyからいくつかのヒントと。私はコードの拡張とケースカバレッジを評価します。
無限ループとは、ホームコントローラが繰り返し呼び出されることを意味します。 –
@SivaGopalはいリダイレクトされたurlに対してもbeginrequestが実行され、urlはレスポンスヘッダLocationを追加してレスポンスヘッダLocationを追加することで別のリダイレクトを引き起こし、このプロセスは継続して行きます。私はHome.aspxページのロードイベントでResponse.Redirect( "〜/ Home.aspx")を書くのと同様の状況に陥ります。 –
2番目のリダイレクトを防ぐ 'if'条件を追加するだけですか? –