2011-12-21 43 views
10

Tôi vài năm trước tôi đã tạo một trang ASP.NET dựa trên cơ sở dữ liệu, sử dụng một trang APSX duy nhất để hiển thị tất cả các trang của trang. Vì vậy, tất cả các URL của trang web có định dạng sau:Chuỗi truy vấn đăng nhập Plus cho trang web ASP.NET

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

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

/main.aspx?page=Third+Page 

Trang main.aspx được các dữ liệu chuỗi truy vấn (trang + Tiêu đề + Một ví dụ) và sử dụng nó như là một chìa khóa để kéo bài viết thích hợp nội dung từ cơ sở dữ liệu máy chủ SQL. Tiêu đề thực sự của trang được lưu trữ trong db với dấu cách thay vì dấu cộng (ví dụ "Trang Tiêu đề Một").

Quyết định kém đi cùng với dấu + làm dấu phân tách từ trong chuỗi truy vấn URL đang gây ra nhiều vấn đề với công cụ tìm kiếm gần đây (nội dung trùng lặp, v.v.), vì vậy tôi muốn khắc phục, nhưng không thay đổi URL .

Những gì tôi muốn làm là khi công cụ tìm kiếm hoặc truy cập cố gắng đến thăm URL sai thiếu những dấu hiệu + và có không gian trắng thay vào đó, ví dụ:

/main.aspx?page=Page Title One 

tôi muốn làm chuyển hướng 301 vĩnh viễn:

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

để có thể làm được điều này tôi cần phải kiểm tra xem giá trị chuỗi truy vấn có ưu điểm hay không gian màu trắng, tuy nhiên khi tôi nhận được giá trị với Request.QueryString [ "trang"] ngay cả khi chuỗi quesry thực tế có Điểm cộng trong đó tôi vẫn nhận được chuỗi ký tự có khoảng trắng "Page Title One".

Trang web chạy trên IIS6/Win 2003.

Tôi làm cách nào để thực hiện việc này?

Trả lời

2

Vâng, tất nhiên bạn không thể đặt khoảng trống trong URI trong mọi trường hợp. Những gì bạn có thể làm là đặt %20 trong đó là cách mã hóa một không gian tại bất kỳ điểm nào trong URI cũng như + là cách thông thường để mã hóa một không gian trong phần truy vấn và cách được đề xuất để làm như vậy trong phần đó của bởi vì% 20 có thể gây ra vấn đề.

Bởi vì điều này là một chi tiết implementaiton application/x-www-form-urlencoded và chúng ta thường quan tâm đến dữ liệu thực tế gửi đi, Request.QueryString[] hiện tự thoát cho bạn, biến cả +%20 vào một không gian.

Bạn muốn xem số Request.RawUrl (trả về một chuỗi) hoặc Request.Url trả về một Uri. Có lẽ cách đơn giản nhất là nạp Request.Url vào một số UriBuilder để bạn chỉ có thể thay đổi truy vấn và nhận lại số Uri.

Tuy nhiên, tôi khuyên bạn nên tiếp cận ngược lại, nếu bạn gặp sự cố với nội dung trùng lặp do hai cách mã hóa không gian trong chuỗi truy vấn, hãy đi theo chỉ tiêu được đề xuất và chuyển các trường hợp %20 thành + thay vì cách khác.

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 của tôi luôn sử dụng dấu cộng thay vì dấu cách trắng hoặc% 20, tuy nhiên tôi thấy các trang được lưu trong bộ nhớ cache trong Google giống như 2: /main.aspx?page=KW1 KW2 và /main.aspx?page=KW1% này 20KW2, cả hai đều sai và đang gây ra các vấn đề nội dung trùng lặp. Bây giờ tôi muốn 301 chúng đến URL thích hợp là /main.aspx?page=KW1+KW2. –

+0

Đó là khá nhiều những gì tôi đã giải thích. Không chắc chắn những gì không rõ ràng, do đó, đã thêm mã ví dụ mà hy vọng giải thích. –

+0

Cảm ơn Jon, đây chính xác là những gì tôi cần :). Làm cách nào để đánh dấu câu hỏi là đã trả lời? –

3

Dấu hiệu + được hiểu là không gian cho URL.

Tức là, để URL mã hóa không gian, bạn có thể sử dụng %20 hoặc +.

Xem this SO answer để "URL mã hóa ký tự khoảng trắng: + hoặc% 20?"

4

Sử dụng Request["key"], nó sẽ tự động chuyển tất cả dấu "+" thành dấu cách. Bạn cần sử dụng Request.RawUrl để xem có dấu cộng hay không.

Ngoài ra, bạn có thể sử dụng System.Web.HttpUtility.ParseQueryString để phân tích cú pháp truy vấn chuỗi bất kỳ. Bạn chỉ có thể kiểm tra nếu Request.QueryString.ToString().Contains("+") là đúng và thực hiện logic từ đó.

+0

Đây chính là vấn đề của tôi. Tôi muốn có thể phân biệt giữa 2 yêu cầu GET sau đây: /main.aspx?page=KW1+KW2 và /main.aspx?page=KW1 KW2. –

+0

Xem bài đăng gốc của tôi. Nó có vẻ như 'Request.QueryString.ToString(). Chứa (" + ")' sẽ cung cấp cho bạn nếu nó là trường hợp đầu tiên hoặc thứ hai. –

+0

Có, nhưng điều này sẽ không giải quyết một URL sai ở định dạng sau /main.aspx?page=KW1 KW2 + KW3. –

0

Bạn có thể thử này:

Request.QueryString["page"].Trim(); 
Các vấn đề liên quan