2009-07-27 18 views
46

Chciałbym wziąć oryginalny adres URL, skrócić parametry ciągu zapytania i zwrócić wyczyszczoną wersję adresu URL. Chciałbym, aby wystąpiło w całej aplikacji, więc wykonywanie przez global.asax byłoby idealne. Ponadto, myślę, że również przekierowanie 301 będzie w porządku.Obcinanie łańcucha zapytania i zwracanie czystego adresu URL C# ASP.net

tj.

w: www.website.com/default.aspx?utm_source=twitter & utm_medium = społecznego przekazu

out: www.website.com/default.aspx

Jaki byłby najlepszy sposób osiągnąć to?

Odpowiedz

100

System.Uri jest tu twoim przyjacielem. To ma wiele przydatnych narzędzi na nim, ale ten, który chcesz jest GetLeftPart:

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

Daje wyjście: http://www.website.com/default.aspx

[Klasa Uri wiąże się z koniecznością protokół http: //, które zostaną określone ]

GetLeftPart basicallys mówi "znajdź lewą część uri aż do części, którą określam". Może to być Scheme (tylko http: // bit), Authority (część www.website.com), Path (the /default.aspx) lub Query (querystring).

Zakładając, że jesteś na stronie internetowej aspx, możesz następnie użyć Response.Redirect (newUrl), aby przekierować dzwoniącego.

nadzieję, że pomoże

+0

Idealny! Dziękuję Panu. – Chris

+0

To, co w końcu wymyśliliśmy: // Rozpocznij złe formatowanie 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); } } Powoduje funkcję, która prawidłowo pobiera adres URL aplikacji. Działa idealnie. – Chris

+0

eek, nie wiem jak to naprawić :(lol – Chris

0

Spójrz na klasę UriBuilder. Możesz go utworzyć za pomocą ciągu URL-a, a obiekt przeanalizuje ten URL i umożliwi dostęp do żądanych elementów.

0

Zgaduję, że chcesz to zrobić, ponieważ chcemy, aby użytkownicy zobaczyć całkiem wyglądające adresy URL. Jedynym sposobem, aby klient "zmienił" adres URL w pasku adresu, jest wysłanie go do nowej lokalizacji - tzn. Musisz go przekierować.

Czy parametry ciągu zapytania wpłyną na wynik Twojej strony? Jeśli tak, musisz sprawdzić, jak zachować stan między żądaniami (zmiennymi sesyjnymi, plikami cookie itp.), Ponieważ parametry ciągu zapytania zostaną utracone, gdy tylko przekierujesz się na stronę bez nich.

Istnieje kilka sposobów można to zrobić globalnie (w kolejności preferencji):

  • Jeśli masz bezpośrednią kontrolę nad swoim środowisku serwera następnie konfigurowalny moduł serwera jak ISAPI_ReWrite lub IIS 7.0 URL Rewrite Module jest doskonałym rozwiązaniem.
  • Niestandardowy IHttpModule jest ładnym, nadającym się do ponownego użytku podejściem do samodzielnego rolowania.
  • Można również zrobić to w global.asax jak sugerujesz

Należy używać tylko kod 301 odpowiedzi jeśli zasób rzeczywiście przeniósł się na stałe. Ponownie, zależy to od tego, czy aplikacja musi używać parametrów ciągu zapytania. Jeśli używasz stałego przekierowania przeglądarki (która respektuje kod odpowiedzi 301), pominie się ładowanie adresu URL, takiego jak .../default.aspx?utm_source = twitter & utm_medium = social-media i załaduj .../default.aspx - nigdy nie dowiesz się o parametrach ciągu zapytań.

Wreszcie, można użyć żądań metody POST. Zapewnia to czyste adresy URL i pozwala przekazywać parametry, ale działa tylko z elementami lub żądaniami utworzonymi przy użyciu JavaScript.

+0

Jeśli chcesz, aby użytkownicy zobaczyli ładnie wyglądające adresy URL, dlaczego nie tylko korzystasz z mapowania adresów URL? –

+0

Mapowanie URL może działać, ale musisz zdefiniować mapowanie dla każdej strony w pliku web.config Nie można zdefiniować ogólnych reguł, ale jeśli w witrynie jest niewiele stron, konfigurowanie ich raz może sprawnie działać, z drugiej strony, przepisywanie adresów URL daje większą kontrolę. – dariom

+0

Robi to, aby dodawać linki kanoniczne i konsolidować ranking strony, a nie do celów przepisywania adresu URL: http: //googlewebmastercentral.blogspot.com/2009 /specify-your-canonical.html –

1

Może to wyglądać nieco lepiej.

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

Następuje funkcja do poprawnego pobrania adresu URL aplikacji.

Działa idealnie.

+3

nie powinno to być bool hasQueryStrings = Request.QueryString.Keys.Count> 0; – George

-3

Po zakończeniu przetwarzania cokolwiek trzeba zrobić w ciągu kwerendy, po prostu podzielić URL na znak zapytania:

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

To prawda, moje rozwiązanie jest w VB.NET, ale bym sobie wyobrazić, że to można łatwo przeportować. A ponieważ szukamy tylko pierwszego elementu podziału, to nawet "zawodzi" z gracją, gdy nie ma querystringu.

6

Oto prosty trik

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

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

Oto szybki sposób na uzyskanie przez administratora sans ścieżka pełna ścieżka i zapytań.

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

Spowoduje to również usunięcie ścieżki, a nie tylko łańcucha zapytania – tocqueville

Powiązane problemy