2017-07-05 24 views
0

私の要件は、古い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を作成してリダイレクトする必要があります。私は自分のドメイン内でリダイレクトする必要が

ノート

  1. ユーザーは、古い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からいくつかのヒントと。私はコードの拡張とケースカバレッジを評価します。

+0

無限ループとは、ホームコントローラが繰り返し呼び出されることを意味します。 –

+0

@SivaGopalはいリダイレクトされたurlに対してもbeginrequestが実行され、urlはレスポンスヘッダLocationを追加してレスポンスヘッダLocationを追加することで別のリダイレクトを引き起こし、このプロセスは継続して行きます。私はHome.aspxページのロードイベントでResponse.Redirect( "〜/ Home.aspx")を書くのと同様の状況に陥ります。 –

+1

2番目のリダイレクトを防ぐ 'if'条件を追加するだけですか? –

答えて

0

あなたの2つの「メモ」は矛盾しています。ドメイン内でのみリダイレクトを許可したい場合は、ドメインを含む完全なURLを記録することはまったく必要ではなく、複雑なものにすぎません。古いURLまたは新しいURLを絶対パスにします。また、適切な環境に適したドメインを持つデータについて心配する必要がないため、開発と生産の両方で作業する上での問題も解決します。

注:あなたの無限のリダイレクトは、コード内のバグです。 (lowercaseUrlではなく)にリダイレクトする必要があります。 newUrlがnullの場合、リダイレクトはありませんので、その場合はリダイレクトしないでください。

+0

これはどのようにして無限のリダイレクト問題を解決しますか? –

+0

@Chris Prattプロトコルやドメイン名以外のコンテンツを追加するよりも、ユーザーが完全なURLを簡単に追加できるようになります。私たちは完全なurから絶対URLを得ることができますが。絶対URLを使用すると、どのように処理されますか? –

+0

リダイレクトには完全なURLは必要ありません。パスにリダイレクトするだけで、現在のドメインとプロトコルが仮定されます。 –

関連する問題