2010-10-23 37 views
47

Tôi có một URL tương đối hoặc tuyệt đối trong một chuỗi. Trước tiên tôi cần phải biết liệu nó là tuyệt đối hay tương đối. Làm thế nào để tôi làm điều này? Sau đó tôi muốn xác định xem tên miền của url có nằm trong danh sách cho phép hay không.Xác định xem URL tuyệt đối hay tương đối

Dưới đây là danh sách cho phép của tôi, như một ví dụ:

string[] Allowed = 
{ 
    "google.com", 
    "yahoo.com", 
    "espn.com" 
} 

Khi tôi biết liệu nó tương đối hoặc tuyệt đối, nó khá đơn giản tôi nghĩ rằng:

if (Url.IsAbsolute) 
{ 
    if (!Url.Contains("://")) 
     Url = "http://" + Url; 

    return Allowed.Contains(new Uri(Url).Host); 
} 
else //Is Relative 
{ 
    return true; 
} 
+3

Đừng quên rằng một số người sử dụng tên miền phụ 'www'. – icktoofay

+0

trùng lặp của http://stackoverflow.com/questions/2201171/determine-if-a-url-is-absolute-or-relative-from-vb –

Trả lời

84
bool IsAbsoluteUrl(string url) 
{ 
    Uri result; 
    return Uri.TryCreate(url, UriKind.Absolute, out result); 
} 
+4

Bạn có thể sử dụng phương thức 'Uri.TryCreate' thay cho mã đẹp hơn. –

+0

Hoạt động. Uri.TryCreate có kiểm tra xem url có giải quyết không? – Mark

+0

@Mark, không phải vậy. –

3

Bạn có thể đạt được những gì bạn muốn trực tiếp hơn với UriBuilder có thể xử lý cả URI tương đối và tuyệt đối (xem ví dụ bên dưới).

@icktoofay cũng có một điểm tốt: hãy chắc chắn bao gồm tên miền phụ (như www.google.com) trong danh sách cho phép của bạn hoặc xử lý thêm trên thuộc tính builder.Host để nhận miền thực. Nếu bạn quyết định xử lý nhiều hơn, đừng quên các URL có TLD phức tạp như bbc.co.uk.

using System; 
using System.Linq; 
using System.Diagnostics; 

namespace UriTest 
{ 
    class Program 
    { 
     static bool IsAllowed(string uri, string[] allowedHosts) 
     { 
      UriBuilder builder = new UriBuilder(uri); 
      return allowedHosts.Contains(builder.Host, StringComparer.OrdinalIgnoreCase); 
     } 

     static void Main(string[] args) 
     { 
      string[] allowedHosts = 
      { 
       "google.com", 
       "yahoo.com", 
       "espn.com" 
      }; 

      // All true 
      Debug.Assert(
       IsAllowed("google.com", allowedHosts) && 
       IsAllowed("google.com/bar", allowedHosts) && 
       IsAllowed("http://google.com/", allowedHosts) && 
       IsAllowed("http://google.com/foo/bar", allowedHosts) && 
       IsAllowed("http://google.com/foo/page.html?bar=baz", allowedHosts) 
      ); 

      // All false 
      Debug.Assert(
       !IsAllowed("foo.com", allowedHosts) && 
       !IsAllowed("foo.com/bar", allowedHosts) && 
       !IsAllowed("http://foo.com/", allowedHosts) && 
       !IsAllowed("http://foo.com/foo/bar", allowedHosts) && 
       !IsAllowed("http://foo.com/foo/page.html?bar=baz", allowedHosts) 
      ); 
     } 
    } 
} 
+0

Tính năng này có hoạt động với các url tương đối không? Một cái gì đó như './Page/test.aspx' Edit: vừa được kiểm tra và nó không thể xử lý một url tương đối. Có uribuilder có phương pháp để xử lý các công cụ tương đối? – Mark

+0

@Mark: không, không có cách nào để 'UriBuilder' biết máy chủ nào bạn muốn trong trường hợp đó. Nó ném một ngoại lệ. Tôi không nghĩ rằng bất kỳ cách tiếp cận có thể xử lý trường hợp đó, mặc dù, vì đó là một URL liên quan đến không có gì (hoặc ít nhất là nó không được chỉ định). –

+0

@ Mark: bỏ qua bình luận cuối cùng của tôi, tôi thấy rằng bạn chỉ muốn 'trả về true;' cho trường hợp tương đối, vì vậy bạn có thể sử dụng 'Uri.TryCreate' như @Ian gợi ý. –

16

Đối với một số lý do một vài câu trả lời tốt đã bị xóa bởi chủ sở hữu của họ:

Via @Chamika Sandamal

Uri.IsWellFormedUriString(url, UriKind.Absolute) 

Uri.IsWellFormedUriString(url, UriKind.Relative) 

Các UriParser và triển khai qua @Marcelo Cantos

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