2009-07-27 14 views
46

元のURLを取得し、クエリ文字列パラメータを切り捨てて、URLのクリーンアップ版を返したいと思います。私はそれがアプリケーション全体で起こるようにしたいので、global.asaxを通して実行することが理想的です。また、301リダイレクトも順調に進んでいると思います。クエリ文字列を切り捨ててクリーンURLを返すC#ASP.net

ie。中

:www.website.com/default.aspx?utm_source=twitter & utm_medium =ソーシャル・メディア

アウト:www.website.com/default.aspx

最良の方法は何だろうこれを達成するには?

答えて

100

System.Uriはここにあなたの友人です。これは、その上に多くの有用なユーティリティを持っていますが、あなたが望む1はGetLeftPartです://、指定する:

http://www.website.com/default.aspxは[URIクラスは、プロトコル、HTTPを必要としない:これは、出力を与える

string url = "http://www.website.com/default.aspx?utm_source=twitter&utm_medium=social-media"; 
Uri uri = new Uri(url); 
Console.WriteLine(uri.GetLeftPart(UriPartial.Path)); 

]

GetLeftPartは基本的には「まで私は指定した部分がまでです」と言っています。 Scheme(http://ビットのみ)、Authority(www.website.comの部分)、Path(/default.aspx)、Query(クエリー文字列)のいずれかになります。

aspx Webページ上にいると仮定すると、Response.Redirect(newUrl)を使用して呼び出し元をリダイレクトできます。私はあなたのユーザーはかなり探してURLを見てみたいので、あなたがこれをしたい推測している

+0

完璧!ありがとうございます。 – Chris

+0

これは私たちが最後に思いついたものです: //フォーマットが貧弱です。 文字列rawUrl = String.Concat(this.GetApplicationUrl()、Request.RawUrl); if(rawUrl.Contains( "/ post /")) { bool hasQueryStrings = Request.QueryString.Keys.Count> 1; if(hasQueryStrings) { Uri uri = new Uri(rawUrl); rawUrl = uri.GetLeftPart(UriPartial.Path); HtmlLink canonical = new HtmlLink(); canonical.Href = rawUrl; canonical.Attributes ["rel"] = "canonical"; Page.Header.Controls.Add(標準); } } アプリケーションURLを正しく取得する関数が続きます。 完全に動作します。 – Chris

+0

eek、それを修正する方法がわからない:(笑 – Chris

0

UriBuilderクラスをご覧ください。 URL文字列を使用してURLを作成すると、オブジェクトがこのURLを解析し、必要な要素だけにアクセスできるようにします。

0

を助け

希望。クライアントにアドレスバーのURLを「変更」させる唯一の方法は、URLを新しい場所に送信することです。つまり、リダイレクトする必要があります。

クエリ文字列のパラメータがページの出力に影響しますか?そのような場合は、リクエスト文字列(セッション変数、Cookieなど)間の状態を維持する方法を検討する必要があります。これは、クエリ文字列パラメータが、ページのないページにリダイレクトされるとすぐに失われるためです。ご使用のサーバー環境を直接制御を持っている場合は、ISAPI_ReWriteまたはIIS 7.0 URL Rewrite Moduleなどの設定可能なサーバモジュールは偉大なアプローチである

  • は、あなたが世界的にこれを行うことができますいくつかの方法(優先順)があります。

  • カスタムIHttpModuleはすばらしい再利用可能な独自のアプローチです。
  • あなたは、リソースが実際に恒久的に移動した場合にのみ、301応答コードを使用する必要があります

を示唆するようまたglobal.asaxでこれを行うことができます。この場合も、アプリケーションがクエリ文字列パラメータを使用する必要があるかどうかによって異なります。あなたが永続的なリダイレクトを使用する場合(301応答コードを尊重します)、.../default.aspxのようなURLの読み込みをスキップしますか?utm_source = twitter & utm_medium =ソーシャルメディアとロード.../default.aspx - クエリ文字列のパラメータについては決して知りません。

最後に、POSTメソッドリクエストを使用できます。これにより、きれいなURLが提供され、パラメータを渡すことができますが、JavaScriptを使用して作成する要素またはリクエストは<form>でのみ機能します。

+0

ユーザーには見栄えの良いURLを見せたい場合は、なぜ –

+0

URLマッピングが機能するかもしれませんが、web.configファイル内のすべてのページのマッピングを定義する必要があります。一般的なルールを定義することはできませんが、 – dariom

+0

URLの書き換えの目的ではなく、標準的なリンクを追加してページランクを統合するために彼はそれをやっています:http://googlewebmastercentral.blogspot.com/2009/02 /specify-your-canonical.html –

1

これは少し良く見えるかもしれません。

string rawUrl = String.Concat(this.GetApplicationUrl(), Request.RawUrl); 

    if (rawUrl.Contains("/post/")) 
    { 
     bool hasQueryStrings = Request.QueryString.Keys.Count > 1; 

     if (hasQueryStrings) 
     { 
      Uri uri = new Uri(rawUrl); 
      rawUrl = uri.GetLeftPart(UriPartial.Path); 

      HtmlLink canonical = new HtmlLink(); 
      canonical.Href = rawUrl; 
      canonical.Attributes["rel"] = "canonical"; 
      Page.Header.Controls.Add(canonical); 
     } 
    } 

アプリケーションURLを正しく取得する機能が続く。

完全に動作します。私の解決策は、VB.NETであり、

Dim _CleanUrl as String = Request.Url.AbsoluteUri.Split("?")(0) 
Response.Redirect(_CleanUrl) 

は確かに、私はそれことを想像する:

+3

これはブールではありませんhasQueryStrings = Request.QueryString.Keys.Count> 0; – George

-3

あなたは、クエリ文字列に行う必要があるものは何でも処理が完了した後、単に疑問符にURLを分割かなり簡単に移植することができます。分割の最初の要素だけを探しているので、クエリー・ストリングがない場合でも正常に「失敗」します。ここで

6

簡単なトリック

Dim uri = New Uri(Request.Url.AbsoluteUri) 

dim reqURL = uri.GetLeftPart(UriPartial.Path) 
1

ここでは、完全なパスとクエリSANSルートパスを取得する簡単な方法です。

string path = Request.Url.AbsoluteUri.Replace(Request.Url.PathAndQuery,""); 
+0

これにより、クエリ文字列だけでなくパスも削除されます – tocqueville

関連する問題