2011-12-21 3 views
10

몇 년 전 나는 하나의 APSX 페이지를 사용하여 모든 사이트 페이지를 표시하는 데이터베이스 기반 ASP.NET 사이트를 만들었습니다. 그래서 사이트의 모든 URL의 형식은 다음과 같습니다더하기 ASP.NET 사이트에 대한 쿼리 문자열

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

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

/main.aspx?page=Third+Page 

main.aspx 페이지는 쿼리 문자열 데이터 (페이지 + 제목 + 예를 들어 하나)을 가져 와서 적절한 문서를 당길 수있는 키로 사용 SQL 서버 데이터베이스의 컨텐츠. 페이지의 실제 제목은 더하기 대신 공백이있는 db에 저장됩니다 (예 : "페이지 제목 1").

URL 검색어 문자열에서 + 기호를 단어 구분 기호로 사용하는 것이 좋지 않은 결정은 최근에 검색 엔진에서 많은 문제를 일으키고 있습니다 (중복 콘텐츠 등). URL을 변경하지 않고 수정하려고합니다. . 나는 301 영구 리디렉션을 수행 할

/main.aspx?page=Page Title One 

: 검색 엔진이나 방문자가 예를 들어, + 표시를 누락하는 대신 공백을 갖는 잘못된 URL을 방문 할 때 내가 원하는 무엇

입니다 :

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

하면 실제 quesry 문자열이있는 경우에도 내가 Request.QueryString을 [ "페이지"]으로 값을 얻을 그러나 때, 쿼리 문자열 값이 흑자 또는 공백이 있는지 확인해야이 작업을 수행 할 수 있도록 그 안에는 여전히 공백 "페이지 제목 1"이있는 문자열이 있습니다.

이 사이트는 IIS6/윈에서 실행 2003

내가 어떻게 할 수 있습니까?

답변

2

물론 어떤 경우에도 URI에 공백을 넣을 수 없습니다. 당신이 할 수있는 일은 +뿐만 아니라 쿼리 부분에서 공간을 인코딩하는 일반적인 방법 인 공간에서 URI를 인코딩하는 방법 인 %20과 그 부분에서 권장되는 방법입니다 왜냐하면 % 20은 문제를 일으킬 수 있기 때문입니다. Request.QueryString[]이 공간에 모두 +%20를 돌려, 당신을 위해 언 이스케이프를 수행,이 때문에

은 application/x-www-form은-urlencoded를 implementaiton 세부이며, 우리는 일반적으로 전송 된 실제 데이터에 대해 신경.

Request.RawUrl (문자열을 반환) 또는 Request.Url (Uri을 반환)을보고 싶습니다. 아마도 가장 쉬운 방법은 Request.UrlUriBuilder에 넣으므로 검색어 만 변경하고 Uri을 다시 얻을 수 있습니다.

여전히 쿼리 문자열의 공간을 인코딩 할 수있는 두 가지 방법으로 인해 중복 콘텐츠에 문제가있는 경우 반대 방법을 사용하는 것이 좋습니다. 권장 표준을 따르고 %20의 사례를 + 대신 다른 방법을 사용하십시오.

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

내 URL은 항상 공백 또는 % 20 대신에 더하기 기호 만 사용했습니다. 그러나 Google에서 캐시 된 페이지는 다음 2와 같이 표시됩니다. /main.aspx?page=KW1 KW2 및 /main.aspx?page=KW1% 20KW2, 둘 다 잘못되어 중복되는 콘텐츠 문제를 일으키고 있습니다. 이제 301 URL을 /main.aspx?page=KW1+KW2라는 올바른 URL로 보내고 싶습니다. –

+0

그게 내가 설명하고있는 것 같아. 확실하지 않은 것이 무엇인지 잘 모르는 채로 코드가 추가되었습니다. –

+0

감사합니다 존, 이것은 정확히 내가 필요한 것입니다 :). 질문에 답변으로 표시하려면 어떻게합니까? –

3

+ 부호는 URL을위한 공간으로 해석됩니다.

즉, URL 인코딩에 공백을 사용하려면 %20 또는 +을 사용할 수 있습니다.

this SO answer "공백 문자 인코딩 URL : + 또는 % 20?"을 참조하십시오.

4

Request["key"]을 사용하면 자동으로 모든 "+"기호를 공백으로 변환합니다. 더하기 기호가 있는지 보려면 Request.RawUrl을 사용해야합니다.

또한 System.Web.HttpUtility.ParseQueryString을 사용하여 모든 문자열 쿼리를 구문 분석 할 수 있습니다. Request.QueryString.ToString().Contains("+")이 true인지 테스트하고 거기에서 로직을 수행 할 수 있습니다.

+0

이 정확히 내 문제입니다. 다음 2 가지 GET 요청을 구분할 수 있기를 원합니다. /main.aspx?page=KW1+KW2 및 /main.aspx?page=KW1 KW2. –

+0

원본 글보기. 그것은 Request.QueryString.ToString(). Contains ("+")와 같이 보입니다. 첫 번째 또는 두 번째 경우에 나타납니다. –

+0

네,하지만 이것은 /main.aspx?page=KW1 KW2 + KW3 형식의 잘못된 URL을 해결하지 못합니다. –

0

이 작업을 시도 할 수 있습니다 :

Request.QueryString["page"].Trim(); 
관련 문제