2009-12-09 24 views
5
Dim x AS New URI("http://www.example.com/test//test.asp") 
Dim rel AS New URI("http://www.example.com/xxx/xxx.asp") 
Console.Writeline(x.MakeRelativeUri(rel).Tostring()) 

Tại đây đầu ra là:Bình thường hoá URI để làm cho nó hoạt động chính xác với MakeRelativeUri

../../xxx/xxx.asp 

nào có vẻ đúng hầu hết các máy chủ web sẽ xử lý hai trong những cách sau như cùng một yêu cầu:

http://www.example.com/test//test.asp 
http://www.example.com/test/test.asp 

Cách tốt nhất để khắc phục hành vi này là có API nào để thực hiện việc này hay tạo thủ công một URI mới và xóa tất cả // trong đường dẫn?

Trả lời

4

Dường như thay thế tất cả các dấu gạch chéo bằng một dấu gạch chéo trong phần LocalPath là giải pháp tốt nhất. IIS làm như vậy ngay cả khi chuyển URL đến ASP.net.

Mã sau sẽ thực hiện thủ thuật.

x = new Uri(string.Format("{0}://{1}:{2}{3}{4}", x.Scheme, x.Host, x.Port, Regex.Replace(x.LocalPath, @"(?<!\:)/{2,}", "/"), x.Query)); 
0

Trước hết, mã của bạn không phải là C# nhưng VB, vì vậy thẻ sai.

Thay vào đó, bạn có thể sử dụng mã này, URL này cung cấp url "chính xác" vì // nằm trong baseuri và sẽ bị hủy không?

var x2 = new Uri(x, rel); 

Hoặc điều quan trọng là có được ../ backtracking trong url?

Hàm MakeRelativeUri thực hiện đúng theo RFC, nhưng không thành công theo quy ước thông thường. Tôi khuyên bạn nên chuẩn hóa url của mình hoặc sử dụng ví dụ trên nếu có thể.

x = new Uri(Regex.Replace(x.OriginalString, "[^:]//", "/")); 
+0

Mã đó rất thô lỗ vì nó sẽ không hoạt động trong một số trường hợp, rõ ràng nhất là http://example.com/test///xxx thứ hai mặc dù nó không được mã hóa rất tốt. URI hợp lệ: http://example.com/?bla=//Whatup –

+0

Dr.Evil: Url hợp lệ phụ thuộc phần lớn vào máy chủ web để diễn giải nó và mức độ mạnh mẽ của nó khi quyết định phân tích url. Vì khung làm việc không làm tất cả việc dọn dẹp như bạn muốn, sau đó tạo một hàm "makerelativeurl" để kiểm tra và làm sạch các dấu gạch chéo một cách thích hợp. Bạn có nên theo dõi RFC hoặc xử lý các trường hợp url rõ ràng không đúng? .) –

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