2009-06-23 29 views
21

Trên một số URL trang web được thúc đẩy .NET không kết thúc bằng tên trang asp.net, như default.aspx, thay vào đó chúng sử dụng mẫu http://sitename.com hoặc http://sitename.com/subdirectory/subdirectory. Trang web được ánh xạ dưới dạng thư mục con ngoài gốc, tức là./tags,/người dùng,/huy hiệu, URL sẽ là/thẻ,/người dùng,/huy hiệu tương ứng.Làm cách nào để nhận các URL sạch như Stack Overflow?

Ngăn xếp ngăn xếp, để sử dụng một ví dụ cụ thể, sử dụng URL câu hỏi của biểu mẫu How do get clean URLs like Stackoverflow?. Đó là cách tuyệt vời để tối ưu hóa trang cho công cụ tìm kiếm.

Điều này có được triển khai bằng trình xử lý HTTP không? Yêu cầu GET được lọc dựa trên đường dẫn và toàn bộ phản hồi được tạo thành trong trình xử lý dựa trên id câu hỏi? Bất cứ ai khác quan tâm đến suy đoán?

+4

Câu hỏi này đã được hỏi rất nhiều lần trước đây. –

+0

Tôi tin rằng tràn ngăn xếp được xây dựng bằng cách sử dụng khung ASP.NET MVC, xem www.asp.net/mvc – Charlie

+5

Thả tham chiếu SO và đây là một câu hỏi hay. –

Trả lời

21

Đó là ASP.Net MVC, trong đó có các Net Routing nhiều hơn hoặc ít hơn được xây dựng trong. Các Routing hiện có sẵn cho các dự án phi MVC là tốt, mặc dù

http://msdn.microsoft.com/en-us/library/cc668201.aspx

Nó chỉ là một .dll bạn có thể thả vào thư mục bin của bạn. Về cơ bản, nó sử dụng cụm từ thông dụng để đối sánh URL của bạn với các trang/mẫu.

+1

Kể từ ASP.NET 4.0, tích hợp định tuyến URL tốt hơn cho các Biểu mẫu Web, được công bố vào cuối năm 2009: [Định tuyến URL với ASP.NET 4 Biểu mẫu Web (VS 2010 và .NET 4.0 Series) - Blog của ScottGu] (http://weblogs.asp.net/scottgu/archive/2009/10/13/url-routing-with-asp-net-4-web-forms-vs-2010-and-net-4-0-series.aspx) – Lumi

18

Điều này đạt được với mod_rewrite trong Apache hoặc các phương pháp tương tự của url_rewriting on IIS.

Lưu ý: SOFlow sử dụng sau.

+2

Tại sao bỏ phiếu xuống? – Sampson

+0

Có lẽ vì nó được ghi nhận rõ ràng rằng trang web không sử dụng Apache. –

+7

Tôi có nói nó sử dụng Apache không? Không. Người hỏi đã quan tâm đến cách hoạt động của URL. Ông không chỉ rõ rằng ông quan tâm đến cách họ làm việc từ một quan điểm .NET. Tôi đã cung cấp một câu trả lời cho cả Apache và IIS. – Sampson

3

Tôi biết rằng Stack Overflow đang sử dụng khung ASP.NET MVC, có lẽ có một hệ thống viết lại URL được tích hợp sẵn. Đối với hệ thống không phải Windows, Apache mod_rewrite rất phổ biến.

Ví dụ: trang wiki: http://server.com/wiki/Main_Page yêu cầu được xử lý bởi máy chủ web. Nó dịch sang /wiki/index.php?page=Main_Page

Dưới đây là một ví dụ về URL viết lại trong Apache:

RewriteEngine on 
RewriteRule ^forum-([0-9]+)\.html$ forumdisplay.php?fid=$1 [L,QSA] 
RewriteRule ^forum-([0-9]+)-page-([0-9]+)\.html$ forumdisplay.php?fid=$1&page=$2 [L,QSA] 

RewriteRule ^thread-([0-9]+)\.html$ showthread.php?tid=$1 [L,QSA] 
RewriteRule ^thread-([0-9]+)-page-([0-9]+)\.html$ showthread.php?tid=$1&page=$2 [L,QSA] 

Điều này có nói là nếu URL mà đi theo là forum-##.html sau đó quá trình mà yêu cầu như thể nó là forumdisplay.php?fid=##. Điều này cũng áp dụng cho các quy tắc thread-##.html.

5

URL ở định dạng sau REST principles trong đó mọi thứ đều là tài nguyên có URL duy nhất.

Tôi nghĩ rằng tôi đã đọc một nơi nào đó trong blog mà điều này đạt được bằng cách sử dụng ASP.NET MVC framework.

0

Bạn có thể làm điều đó trong ASP.net bằng cách sử dụng Context.RewritePath.

Trong Global.asax, tạo bộ xử lý sự kiện Application.BeginRequest.

Ví dụ, nếu bạn muốn thực hiện yêu cầu của

example.com/questions 

thực sự trả lại kết quả từ

example.com/Questions/Default.aspx 

toàn cầu.tuyến Asax:

<%@ Application Language="C#" %> 
<script runat="server"> 

    void Application_BeginRequest(Object sender, EventArgs e) 
    { 
     string originalPath = HttpContext.Current.Request.Path.ToLower(); 

     if (originalPath.Contains("/questions")) 
     { 
      String newPath = originalPath.Replace("/questions", "/Questions/Questions.aspx"); 
      Context.RewritePath(newPath); 
     } 
    } 
</script> 

Nếu trang web của bạn đang chạy bất cứ điều gì trước khi .NET Framework 4, bạn sẽ phải tự bật runAllManagedModulesForAllRequests trong web.config, nếu không sự kiện BeginRequest sẽ không bị sa thải :

<configuration> 
... 
    <system.webServer> 
     <modules runAllManagedModulesForAllRequests="true" /> 
    </system.webServer> 
</configuration> 
Các vấn đề liên quan