2012-04-30 28 views
14

Có cách nào để nhận URL bạn cuối cùng được chuyển hướng đến khi phản hồi yêu cầu xhr là 301 không?

Tôi có trang web chứa nhiều URL cũ từ phiên bản cũ hơn, trả về 301 câu trả lời cho URL mới chính xác.

Vì mục đích tiện ích, tôi muốn có thể gửi yêu cầu tới URL cũ và có thể truy xuất URL mới, tức là gửi yêu cầu tới "/oldpage.aspx?foo=someParam", lấy lại url "/ arbitaryNewPageName/someParam".

Tôi đã chơi xung quanh với điều này trong bảng điều khiển firebug:

$.ajax({ 
      url: "/oldpage.aspx?foo=someParam", 
      success: function(response, status, jqxhr){ 
      //poking around, trying to get the new URL, "/arbitraryNewPage/someParam" 
       console.log(jqxhr.getAllResponseHeaders()); 
       console.log(jqxhr); 
      }, 
      beforeSend: function(jqxhr, settings){ 
       console.log(jqxhr); 
       console.log(settings); 
      } 
     }); 

tôi có thể nhìn thấy trong firebug rằng khi mã này chạy, nó làm một GET để "/oldpage.aspx?foo=someParam" và nhận được phản hồi 301, sau đó chọn GET khác để "/ arbitaryNewPageName/someParam".

Đối với yêu cầu đầu tiên, tôi thấy URL được chuyển hướng trong giá trị Vị trí của tiêu đề phản hồi. Thật không may, yêu cầu thứ hai là những gì được chuyển đến hàm $ .ajax.success và nó chỉ có URL được chuyển hướng trong giá trị Liên kết giới thiệu của tiêu đề yêu cầu.

Có cách nào để chặn phản hồi cho câu trả lời đầu tiên hoặc có thể thấy tiêu đề yêu cầu cho yêu cầu thứ hai không?

Chỉnh sửa: Cảm ơn mọi người đã trả lời. Tôi nghĩ tôi cần đưa ra một chút nền tảng để làm rõ chính xác những gì tôi đang tìm kiếm.

Một người dùng doanh nghiệp đã yêu cầu tôi tạo danh sách liên kết URL cũ với URL mới. Vì tôi đã triển khai phương tiện chuyển hướng URL cũ sang URL mới trên máy chủ, tôi hy vọng sẽ khôi phục công việc đó và tạo tập lệnh đặt yêu cầu cho URL cũ và nhận URL mà yêu cầu được chuyển hướng đến. Một cái gì đó như thế này:

for (var i = 0; i < arrayOfLegacyUrls.length; i++) 
{ 
    $.ajax({ 
      url: arrayOfLegacyUrls[i], 
      success: function(response, status, jqxhr){ 
       var newUrl = "???"; //do magic to get URL that request was redirected to 

       writeToFileForBusinessUser(arrayOfLegacyUrls[i], newUrl); 
      } 
     }); 
} 

Điểm mấu chốt của câu hỏi của tôi là thế này: Tôi có thể có được URL yêu cầu của tôi được chuyển đến từ XHR? Cho đến nay, câu trả lời có vẻ là "không".

+0

Bạn có thể muốn đọc bài này: http://stackoverflow.com/a/1534662/64741 – Zachary

+0

thể trùng lặp của [Xác định những gì jQuery .ajax() giải quyết một chuỗi chuyển hướng to] (http://stackoverflow.com/questions/6767618/determining-what-jquery-ajax-resolves-a-string-of-redirects-to) – JAAulde

Trả lời

1

Tôi tìm thấy một cách để làm điều này bằng cách sử dụng các đối tượng XHR thực tế thay vì phương pháp ajax jquery từ câu trả lời này: https://stackoverflow.com/a/7015798/194099

var r = new XMLHttpRequest(); 
r.open("GET", "http://mysite.com/legacyUrl.aspx?bla=bla"); 
r.overrideMimeType("text/xml"); 
r.onload = function() 
{ 
    alert(r.responseXML.baseURI); //gets the URL the request was redirected to! huzzah! 
} 
r.send(null); 

Với điều này, tôi đã có thể đặt một yêu cầu đến một URL Tôi biết sẽ trả lại 301 và nhận URL mà yêu cầu đang được chuyển hướng đến.

+0

Vấn đề với giải pháp này là nó chỉ hoạt động nếu đáp ứng là nội dung HTML (có thể là XML?). Nếu bạn nhận được JSON, văn bản thuần túy, hình ảnh, không có gì cả, v.v., điều này sẽ không hoạt động. – jordanbtucker

1

Nó có nghĩa là để làm việc một cách minh bạch, ít nhất đó là những gì gợi ý ở đây:

Ajax Redirection HandlingPrevent redirection of Xmlhttprequest

Một điều bạn có thể làm là vượt qua các URL như một tham số ngữ cảnh để gọi AJAX, và sau đó trong thành công so sánh URL phản hồi với thuộc tính URL của đối tượng ngữ cảnh.

Xem ở đây để biết thông tin về bối cảnh: http://api.jquery.com/jQuery.ajax/#jQuery-ajax-settings

Cập nhật:

Một khó khăn thực sự là địa chỉ URL mới, tôi nghĩ bạn có thể có được nó bằng cách gọi this.url nếu bạn không ghi đè thứ econtext.

for (var i = 0; i < arrayOfLegacyUrls.length; i++) 
{ 
    $.ajax({ 
     url: arrayOfLegacyUrls[i], 
     success: function(response, status, jqxhr){ 
      var newUrl = jqxhr.getResponseHeader("X-MYAPP-PATH"); 
      writeToFileForBusinessUser(arrayOfLegacyUrls[i], newUrl); 
     } 
    }); 
} 
+0

Khi bạn nói "URL phản hồi", ý của bạn là URL yêu cầu của tôi cuối cùng được chuyển hướng đến? Tôi có thể truy cập như thế nào? – BenWillkommen

+0

Vâng, tôi đã nhầm lẫn suy nghĩ thêm về URL gốc. Hãy thử 'this.url' bên trong phương thức thành công. Tôi đã cập nhật câu trả lời cho phù hợp. – Meligy

+0

Thật không may, this.url chứa URL cũ mà tôi đã biết. – BenWillkommen

1

Check-out XMLHttpRequest.responseURL

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