2009-04-01 46 views
13

Tôi có một bảng trong cơ sở dữ liệu chứa URL của một số trang web. Tôi phải mở các URL đó và xác minh một số liên kết trên các trang đó. Vấn đề là một số URL được chuyển hướng đến các URL khác. Logic của tôi không thành công cho các URL như vậy.Nhận URL được chuyển hướng từ URL gốc

Có cách nào để tôi có thể chuyển chuỗi URL ban đầu của mình và nhận lại URL được chuyển hướng không?

Ví dụ: Tôi đang cố gắng với URL này: http://individual.troweprice.com/public/Retail/xStaticFiles/FormsAndLiterature/CollegeSavings/trp529Disclosure.pdf

Nó được chuyển hướng đến này một: http://individual.troweprice.com/staticFiles/Retail/Shared/PDFs/trp529Disclosure.pdf

Tôi cố gắng để sử dụng đoạn mã sau:

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(Uris); 
req.Proxy = proxy; 
req.Method = "HEAD"; 
req.AllowAutoRedirect = false; 

HttpWebResponse myResp = (HttpWebResponse)req.GetResponse(); 
if (myResp.StatusCode == HttpStatusCode.Redirect) 
{ 
    MessageBox.Show("redirected to:" + myResp.GetResponseHeader("Location")); 
} 

Khi tôi thực hiện mã ở trên nó mang lại cho tôi HttpStatusCodeOk. Tôi ngạc nhiên vì sao nó không coi đó là một sự chuyển hướng. Nếu tôi mở liên kết trong Internet Explorer thì nó sẽ chuyển hướng đến một URL khác và mở tệp PDF.

Ai đó có thể giúp tôi hiểu tại sao nó không hoạt động đúng với URL ví dụ không?

Nhân tiện, tôi đã kiểm tra bằng URL của Hotmail (http://www.hotmail.com) và nó trả về chính xác URL được chuyển hướng.

Cảm ơn,

Trả lời

17

URL bạn đã đề cập sử dụng chuyển hướng JavaScript, sẽ chỉ chuyển hướng trình duyệt. Vì vậy, không có cách nào dễ dàng để phát hiện chuyển hướng.

Đối thích hợp (HTTP Status Code và vị trí :) chuyển hướng, bạn có thể muốn loại bỏ

req.AllowAutoRedirect = false; 

và nhận được URL cuối cùng sử dụng

myResp.ResponseUri 

như có thể có nhiều hơn một chuyển hướng.

UPDATE: More làm rõ liên quan đến chuyển hướng:

Có nhiều hơn một cách để chuyển hướng trình duyệt tới URL khác.

Cách đầu tiên là sử dụng mã trạng thái HTTP 3xx và tiêu đề Vị trí:. Đây là cách các vị thần dự định chuyển hướng HTTP để hoạt động, và còn được gọi là "một cách thực sự". Phương pháp này sẽ hoạt động trên tất cả trình duyệt và trình thu thập thông tin.

Và sau đó có những cách của ma quỷ. Chúng bao gồm meta refresh, tiêu đề Làm mới: và JavaScript. Mặc dù các phương pháp này hoạt động trong hầu hết các trình duyệt, chúng chắc chắn không được bảo đảm để hoạt động và đôi khi dẫn đến hành vi lạ (aka. breaking the back button).

Hầu hết trình thu thập thông tin web, bao gồm Googlebot, bỏ qua các phương pháp chuyển hướng này và bạn cũng nên làm như vậy. Nếu bạn hoàn toàn để phát hiện tất cả chuyển hướng, thì bạn sẽ phải phân tích HTML cho thẻ META, hãy tìm Làm mới: tiêu đề trong phản hồi và đánh giá Javascript. Chúc may mắn với người cuối cùng.

+0

Xóa req.AllowAutoRedirect = false; không giúp đỡ – user85594

+0

Tôi hiểu điểm chuyển hướng javascript của bạn, nhưng khi tôi sử dụng myResp.ResponseUri.AbsoluteUri, nó cung cấp cho tôi URL gốc thay vì chuyển hướng. Vì vậy, có cách nào khác để nhận URL được chuyển hướng không? – user85594

+0

URL được đề cập sẽ luôn trả về cùng một URL vì URL không chuyển hướng. Chuyển hướng * rõ ràng * chỉ là Javascript và bạn sẽ phải đánh giá Javascript để phát hiện nó. –

0

Bạn có thể kiểm tra Request.UrlReferrer.AbsoluteUri để xem tôi đến từ đâu. Nếu điều đó không hoạt động, bạn có thể chuyển url cũ dưới dạng tham số chuỗi truy vấn không?

+0

Khi tôi gỡ lỗi mã req.Referer là null và myResp.ResponseUri.AbsoluteUri trả về URL gốc thay vì URL được chuyển hướng. Tôi không thể tìm thấy phương thức UrlReferrer có sẵn với đối tượng Yêu cầu. – user85594

-1

Tôi đã thực hiện phương pháp này bằng mã của bạn và nó trả về URL được chuyển hướng cuối cùng.

 public string GetFinalRedirectedUrl(string url) 
    { 
     string result = string.Empty; 

     Uri Uris = new Uri(url); 

     HttpWebRequest req = (HttpWebRequest)WebRequest.Create(Uris); 
     //req3.Proxy = proxy; 
     req.Method = "HEAD"; 
     req.AllowAutoRedirect = false; 

     HttpWebResponse myResp = (HttpWebResponse)req.GetResponse(); 
     if (myResp.StatusCode == HttpStatusCode.Redirect) 
     { 
      string temp = myResp.GetResponseHeader("Location"); 
      //Recursive call 
      result = GetFinalRedirectedUrl(temp); 
     } 
     else 
     { 
      result = url; 
     } 

     return result; 
    } 

Lưu ý: myResp.ResponseUri không trả lại URL cuối cùng

0

Mã này làm việc cho tôi

var request = (HttpWebRequest)HttpWebRequest.Create(url); 
request.Method = "POST"; 
request.AllowAutoRedirect = true; 
request.ContentType = "application/x-www-form-urlencoded"; 
var response = request.GetResponse(); 

// Sau khi gửi yêu cầu và yêu cầu được dự kiến ​​sẽ chuyển hướng đến một số trang của trang web của bạn, Phản hồi.ResponseUri.AbsoluteUri chứa url đó bao gồm các chuỗi truy vấn // (www.yourwebsite.com/returnulr?r = "" ... v.v.)

Redirect(response.ResponseUri.AbsoluteUri); //then just do your own redirect. 

Hope this helps

5

sử dụng mã này để có được chuyển hướng url

public void GrtUrl(string url) 
    { 
     HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url); 
     webRequest.AllowAutoRedirect = false; // IMPORTANT 

     webRequest.Timeout = 10000;   // timeout 10s 
     webRequest.Method = "HEAD"; 
     // Get the response ... 
     HttpWebResponse webResponse; 
     using (webResponse = (HttpWebResponse)webRequest.GetResponse()) 
     { 
      // Now look to see if it's a redirect 
      if ((int)webResponse.StatusCode >= 300 && (int)webResponse.StatusCode <= 399) 
      { 
       string uriString = webResponse.Headers["Location"]; 
       Console.WriteLine("Redirect to " + uriString ?? "NULL"); 
       webResponse.Close(); // don't forget to close it - or bad things happen! 
      } 

     } 

    } 
12

Chức năng này sẽ trở lại với điểm đến cuối cùng của một liên kết - ngay cả khi có nhiều chuyển hướng. Nó không tính đến chuyển hướng dựa trên JavaScript hoặc chuyển hướng META. Lưu ý rằng giải pháp trước đó không giải quyết được các URL tương đối tuyệt đối, vì tiêu đề LOCATION có thể trả về một cái gì đó như "/ newhome", bạn cần phải kết hợp với URL đã phân phát phản hồi đó để xác định đích URL đầy đủ.

public static string GetFinalRedirect(string url) 
    { 
     if(string.IsNullOrWhiteSpace(url)) 
      return url; 

     int maxRedirCount = 8; // prevent infinite loops 
     string newUrl = url; 
     do 
     { 
      HttpWebRequest req = null; 
      HttpWebResponse resp = null; 
      try 
      { 
       req = (HttpWebRequest) HttpWebRequest.Create(url); 
       req.Method = "HEAD"; 
       req.AllowAutoRedirect = false; 
       resp = (HttpWebResponse)req.GetResponse(); 
       switch (resp.StatusCode) 
       { 
        case HttpStatusCode.OK: 
         return newUrl; 
        case HttpStatusCode.Redirect: 
        case HttpStatusCode.MovedPermanently: 
        case HttpStatusCode.RedirectKeepVerb: 
        case HttpStatusCode.RedirectMethod: 
         newUrl = resp.Headers["Location"]; 
         if (newUrl == null) 
          return url; 

         if (newUrl.IndexOf("://", System.StringComparison.Ordinal) == -1) 
         { 
          // Doesn't have a URL Schema, meaning it's a relative or absolute URL 
          Uri u = new Uri(new Uri(url), newUrl); 
          newUrl = u.ToString(); 
         } 
         break; 
        default: 
         return newUrl; 
       } 
       url = newUrl; 
      } 
      catch (WebException) 
      { 
       // Return the last known good URL 
       return newUrl; 
      } 
      catch (Exception ex) 
      { 
       return null; 
      } 
      finally 
      { 
       if (resp != null) 
        resp.Close(); 
      } 
     } while (maxRedirCount-- > 0); 

     return newUrl; 
    } 
+0

Tôi đã lấy http://feeds.gawker.com/lifehacker/full làm ví dụ. Công cụ Chrome dev hiển thị chuyển hướng 307 và tiêu đề vị trí được đặt thành https://feeds.feedburner.com/lifehacker/full. Nhưng khi tôi sử dụng mã của bạn ở trên tôi luôn nhận được 200 OK. Bất kỳ ý tưởng? – Howiecamp

+0

@Howiecamp Rất có thể họ đang gửi các phản hồi khác nhau dựa trên User-Agent. Bạn có thể thay đổi req.UserAgent để trông giống như một trình duyệt Chrome. –

0

tôi đã cùng một vấn đề và sau tryin rất nhiều tôi không thể có được những gì tôi muốn với HttpWebRequest vì vậy tôi sử dụng lớp trình duyệt web để điều hướng đến url đầu tiên và sau đó tôi có thể nhận được các url chuyển hướng!

WebBrowser browser = new WebBrowser(); 
browser.Navigating += new System.Windows.Forms.WebBrowserNavigatingEventHandler(this.browser_Navigating); 
string urlToNavigate = "your url"; 
browser.Navigate(new Uri(urlToNavigate)); 

khi đó điều hướng bạn có thể nhận được url được chuyển hướng của bạn. Hãy cẩn thận khi trình duyệt lần đầu tiên hủy xử lý sự kiện xảy ra, e.url là cùng một url bạn đã sử dụng để bắt đầu duyệt để bạn có thể nhận được url được chuyển hướng trên cuộc gọi thứ hai

private void browser_Navigating(object sender, WebBrowserNavigatingEventArgs e) 
{ 
    Uri uri = e.Url; 
} 
Các vấn đề liên quan