2009-07-27 12 views
46

Tôi muốn lấy URL gốc, cắt ngắn các tham số chuỗi truy vấn và trả lại phiên bản URL đã được dọn dẹp. Tôi muốn nó xảy ra trên toàn bộ ứng dụng, do đó, thực hiện thông qua global.asax sẽ là lý tưởng. Ngoài ra, tôi nghĩ rằng chuyển hướng 301 cũng sẽ theo thứ tự.Cắt xén chuỗi truy vấn & trả lại URL sạch C# ASP.net

tức là.

trong: www.website.com/default.aspx?utm_source=twitter & utm_medium = truyền thông xã hội

ra: www.website.com/default.aspx

Điều gì sẽ là cách tốt nhất để đạt được điều này?

Trả lời

100

System.Uri là bạn của bạn ở đây. Này có nhiều tiện ích hữu ích về nó, nhưng một trong những bạn muốn là 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)); 

này cho kết quả: http://www.website.com/default.aspx

[Lớp Uri không đòi hỏi giao thức, http: //, được xác định ]

GetLeftPart về cơ bản nói "lấy phần bên trái của uri tối đa phần tôi chỉ định". Đây có thể là Scheme (chỉ http: // bit), Authority (phần www.website.com), Đường dẫn (/default.aspx) hoặc Query (chuỗi truy vấn).

Giả sử bạn đang ở trên trang web aspx, bạn có thể sử dụng Response.Redirect (newUrl) để chuyển hướng người gọi.

Hy vọng rằng sẽ giúp

+0

Hoàn hảo! Cảm ơn ngài. – Chris

+0

Điều này cuối cùng chúng tôi đã đưa ra: // bắt đầu định dạng kém chuỗi rawUrl = String.Concat (this.GetApplicationUrl(), Request.RawUrl); nếu (rawUrl.Contains ("/ post /")) { bool hasQueryStrings = Request.QueryString.Keys.Count> 1; nếu (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); } } Tiếp theo là một hàm để tìm nạp đúng URL ứng dụng. Hoạt động hoàn hảo. – Chris

+0

eek, không chắc chắn cách khắc phục điều đó: (lol – Chris

0

Hãy xem lớp UriBuilder. Bạn có thể tạo một chuỗi với chuỗi url và đối tượng sẽ phân tích cú pháp url này và cho phép bạn truy cập chỉ các yếu tố bạn muốn.

0

Tôi đoán rằng bạn muốn làm điều này vì bạn muốn người dùng của mình nhìn thấy URL đẹp. Cách duy nhất để khách hàng "thay đổi" URL trong thanh địa chỉ là gửi URL đến vị trí mới - tức là bạn cần chuyển hướng chúng.

Thông số chuỗi truy vấn có ảnh hưởng đến đầu ra của trang của bạn không? Nếu vậy, bạn sẽ phải xem xét cách duy trì trạng thái giữa các yêu cầu (biến phiên, cookie, v.v.) vì các tham số chuỗi truy vấn của bạn sẽ bị mất ngay sau khi bạn chuyển hướng đến trang không có chúng.

Có một vài cách bạn có thể làm điều này trên toàn cầu (theo thứ tự ưu tiên):

  • Nếu bạn có quyền kiểm soát trực tiếp trên môi trường máy chủ của bạn sau đó một mô-đun máy chủ cấu hình như ISAPI_ReWrite hoặc IIS 7.0 URL Rewrite Module là một phương pháp tuyệt vời.
  • Một tùy chỉnh IHttpModule là một cách tiếp cận tốt đẹp, có thể tái sử dụng của riêng bạn.
  • Bạn cũng có thể làm điều này trong global.asax như bạn đề nghị

Bạn chỉ nên sử dụng mã 301 phản ứng nếu các nguồn lực đã thực sự chuyển vĩnh viễn. Một lần nữa, điều này phụ thuộc vào việc ứng dụng của bạn có cần sử dụng các tham số chuỗi truy vấn hay không. Nếu bạn sử dụng chuyển hướng vĩnh viễn một trình duyệt (tuân theo mã phản hồi 301) sẽ bỏ qua việc tải một URL như .../default.aspx?utm_source = twitter & utm_medium = social-media và tải .../default.aspx - bạn sẽ không bao giờ biết về các tham số chuỗi truy vấn.

Cuối cùng, bạn có thể sử dụng yêu cầu phương thức POST. Điều này cung cấp cho bạn các URL sạch và cho phép bạn chuyển các tham số vào, nhưng sẽ chỉ hoạt động với các phần tử hoặc yêu cầu bạn tạo bằng cách sử dụng JavaScript <form>.

+0

Nếu bạn muốn người dùng nhìn thấy các url đẹp, tại sao không chỉ sử dụng ánh xạ URL? –

+0

Ánh xạ URL có thể hoạt động, nhưng bạn cần xác định ánh xạ cho mọi trang trong tệp web.config của mình. Bạn không thể xác định các quy tắc chung. Tuy nhiên, nếu không có nhiều trang trong trang web, Mặt khác, việc viết lại URL cho phép bạn kiểm soát nhiều hơn nữa. – dariom

+0

Anh ấy đang làm việc đó để thêm các liên kết chuẩn và củng cố thứ hạng trang, không phải cho các mục đích viết lại url: http: //googlewebmastercentral.blogspot.com/2009/02 /specify-your-canonical.html –

1

Điều này có thể trông đẹp hơn một chút.

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

Tiếp theo là một hàm để tìm nạp đúng URL ứng dụng.

Hoạt động hoàn hảo.

+3

không nên là bool cóQueryStrings = Request.QueryString.Keys.Count> 0; – George

-3

Sau khi hoàn thành bất cứ điều gì chế biến bạn cần phải làm trên chuỗi truy vấn, chỉ chia url vào dấu chấm hỏi:

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

Cấp, giải pháp của tôi là trong VB.NET, nhưng tôi muốn tưởng tượng rằng nó có thể được chuyển qua khá dễ dàng. Và vì chúng ta chỉ đang tìm kiếm phần tử đầu tiên của sự phân chia, nó thậm chí còn "thất bại" một cách duyên dáng khi không có chuỗi truy vấn.

6

Đây là một thủ thuật đơn giản

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

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

Dưới đây là một cách nhanh chóng nhận được sans đường dẫn gốc đường dẫn đầy đủ và truy vấn.

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

Điều này cũng sẽ xóa Đường dẫn, không chỉ chuỗi Truy vấn – tocqueville

Các vấn đề liên quan