2011-12-21 23 views
10

Kilka lat temu utworzyłem witrynę ASP.NET opartą na bazie danych, która wykorzystuje jedną stronę APSX do wyświetlania wszystkich stron witryny. Więc wszystkie adresy URL witryny znajdują się w następującym formacie:Znak plusa w ciągu zapytania dla strony ASP.NET

/main.aspx?page=Page+Title+One 

/main.aspx?page=Another+Article+Title 

/main.aspx?page=Third+Page 

Strona main.aspx pobiera dane ciąg kwerendy (strona + Tytuł + Jeden na przykład) i używa go jako klucza do ciągnięcia odpowiedniego artykułu zawartość z bazy danych serwera SQL. Rzeczywisty tytuł strony jest przechowywany w bazie danych za pomocą spacji zamiast plusów (na przykład "Tytuł strony pierwszej").

Zła decyzja, aby przejść ze znakiem + jako separatorem wyrazów w ciągu zapytania adresu URL powoduje ostatnio wiele problemów z wyszukiwarkami (duplikowanie treści itp.), Więc chcę to naprawić, ale bez zmiany adresów URL .

Co chcę zrobić, to kiedy wyszukiwarka lub użytkownik próbuje odwiedzić niewłaściwy adres brakuje + znaki i posiadające spacji zamiast, na przykład:

/main.aspx?page=Page Title One 

chcę zrobić 301 trwałe przekierowanie do:

/main.aspx?page=Page+Title+One 

aby móc to muszę sprawdzić, czy ciąg znaków zapytania ma plusy lub spacji, jednak gdy pojawia się wartość z Request.QueryString [ „strony”] zrobić nawet jeśli ciąg ma rzeczywisty quesry plusy w nim Ciągle otrzymuję ciąg z białymi spacjami "Tytuł strony pierwszej".

Witryna działa na IIS6/Win 2003

Jak mogę to zrobić?

Odpowiedz

2

Oczywiście, w żadnym wypadku nie można umieścić spacji w identyfikatorze URI. To, co możesz zrobić, to wstawić %20, w którym jest sposób kodowania spacji w dowolnym punkcie URI, jak również +, będący normalnym sposobem kodowania spacji w części kwerendy, i zalecanym sposobem wykonania tej operacji w tej części ponieważ% 20 może powodować problemy.

Z tego powodu jest to szczegół implementaiton application/x-www-form-urlencoded i zwykle dbają o rzeczywistych danych wysłanych Request.QueryString[] robi unescaping dla ciebie, obracając zarówno + i %20 w przestrzeni.

Chcesz spojrzeć na Request.RawUrl (zwraca ciąg) lub Request.Url, który zwraca Uri. Prawdopodobnie najłatwiej jest przesłać Request.Url do UriBuilder, dzięki czemu możesz zmienić tylko zapytanie i odzyskać Uri.

Mimo to zalecam podejście odwrotne, jeśli występują problemy z powieloną treścią z powodu dwóch możliwych sposobów kodowania spacji w ciągu zapytania, przejdź do zalecanej normy i włącz przypadki %20 w + zamiast na odwrót.

var u = Request.Url; 
if(u.Query.Contains("%20")) 
{ 
    var ub = new UriBuilder(u); 
    Console.WriteLine(ub.Query); 
    string query = ub.Query; 
    //note bug in Query property - it includes ? in get and expects it not to be there on set 
    ub.Query = ub.Query.Replace("%20", "+").Substring(1); 
    Response.StatusCode = 301; 
    Response.RedirectLocation = ub.Uri.AbsoluteUri; 
    Response.End(); 
} 
+0

Moje adresy URL zawsze używały znaku plus zamiast białych spacji lub% 20, jednak widzę strony z pamięci podręcznej w Google wyglądające jak te 2: /main.aspx?page=KW1 KW2 i /main.aspx?page=KW1% 20KW2, które są błędne i powodują problemy z duplikatami treści. Teraz chcę je 301 na właściwy URL, który jest/main.aspx?page=KW1+KW2. –

+0

To właśnie wyjaśniałem. Nie wiem, co było niejasne, więc dodajmy przykład kodu, który, mam nadzieję, wyjaśnia. –

+0

Dzięki Jon, to jest dokładnie to, czego potrzebowałem :). Jak oznaczyć pytanie jako udzielone? –

3

Znak + interpretowany jest jako spacja dla adresów URL.

Oznacza to, że aby zakodować spację w adresie URL, można użyć %20 lub +.

Zobacz this SO answer na "URL kodujący znak spacji: + lub% 20?"

4

Używając Request["key"], automatycznie konwertuje wszystkie znaki "+" na spacje. Musisz użyć numeru Request.RawUrl, aby sprawdzić, czy są znaki plus.

Dodatkowo, możesz użyć System.Web.HttpUtility.ParseQueryString, aby przeanalizować dowolne zapytanie łańcuchowe. Możesz po prostu sprawdzić, czy Request.QueryString.ToString().Contains("+") jest prawdziwe, i stamtąd logiki.

+0

To jest dokładnie mój problem. Chcę móc rozróżnić następujące 2 żądania GET: /main.aspx?page=KW1+KW2 i /main.aspx?page=KW1 KW2. –

+0

Zobacz mój oryginalny post. Wydaje się, że 'Request.QueryString.ToString(). Zawiera (" + ")' da ci, jeśli jest to pierwszy lub drugi przypadek. –

+0

Tak, ale nie rozwiąże to niewłaściwego adresu URL w następującym formacie /.main.aspx?page=KW1 KW2 + KW3. –

0

Można spróbować to:

Request.QueryString["page"].Trim();