Ngăn chặn chuyển hướng của Xmlhttprequest


112

Có thể ngăn trình duyệt chạy theo các chuyển hướng khi gửi XMLHttpRequest-s (tức là lấy lại mã trạng thái chuyển hướng và tự xử lý) không?

Câu trả lời:


102

Không theo tiêu chuẩn W3C cho đối tượng XMLHttpRequest (đã thêm phần nhấn mạnh):

Nếu phản hồi là chuyển hướng HTTP:

Nếu nguồn gốc của URL được truyền tải bởi tiêu đề Vị trí có cùng nguồn gốc với nguồn gốc XMLHttpRequest và chuyển hướng không vi phạm các biện pháp phòng ngừa vòng lặp vô hạn, hãy tuân theo chuyển hướng một cách rõ ràng trong khi tuân thủ các quy tắc sự kiện yêu cầu cùng nguồn gốc.

Họ đang xem xét nó cho một bản phát hành trong tương lai:

Thông số kỹ thuật này không bao gồm các tính năng sau đang được xem xét cho phiên bản tương lai của thông số kỹ thuật này:

  • Thuộc tính để vô hiệu hóa các chuyển hướng sau;

nhưng đặc điểm kỹ thuật mới nhất không còn đề cập đến điều này.


5
Điều nực cười là khi chuyển hướng trong suốt liên quan đến việc ghi đè một số tiêu đề HTTP đã được đặt trong yêu cầu ban đầu. Cụ thể, nếu tiêu đề "Chấp nhận" được đặt thành kiểu nội dung cụ thể, Firefox sẽ không bao gồm tiêu đề này khi đi theo chuyển hướng (điều này khiến việc phát triển các dịch vụ web hoàn toàn dựa trên REST sử dụng tiêu đề này trở nên khó khăn hơn một chút ... càu nhàu).
ruquay

1
Một số tìm kiếm khác đã mang lại cho tôi báo cáo lỗi khá cũ này: bugzilla.mozilla.org/show_bug.cgi?id=401564
ruquay

2
Đồng ý, hoàn toàn thiếu sót trong thiết kế.
Rực rỡ

35

Mới Fetch API hỗ trợ chế độ khác nhau của xử lý chuyển hướng: follow, error, và manual, nhưng tôi không thể tìm thấy một cách để xem các URL mới hoặc mã trạng thái khi chuyển hướng đã bị hủy. Bạn chỉ có thể dừng chuyển hướng chính nó, và sau đó nó giống như một lỗi (phản hồi trống). Nếu đó là tất cả những gì bạn cần, bạn nên đi. Ngoài ra, bạn nên biết rằng các yêu cầu được thực hiện qua API này vẫn chưa thể hủy được . Bây giờ họ đang ở .

Đối với XMLHttpRequest, bạn có thể HEADmáy chủ và kiểm tra xem URL đã thay đổi hay chưa:

var http = new XMLHttpRequest();
http.open('HEAD', '/the/url');
http.onreadystatechange = function() {
    if (this.readyState === this.DONE) {
        console.log(this.responseURL);
    }
};
http.send();

Bạn sẽ không nhận được mã trạng thái, nhưng sẽ tìm thấy URL mới mà không cần tải xuống toàn bộ trang từ đó.


Đôi khi sử dụng OPTIONScó thể là một lựa chọn tốt hơn, dù sao chỉ hoạt động cho mục đích chung phi vv quản trị đã cấu hình chuyển hướng các trang web toàn / lược đồ, chẳng hạn như HTTP -> HTTPS
William Leung

12

Bạn có thể sử dụng thuộc responseURLtính để lấy đích chuyển hướng hoặc kiểm tra xem cuối cùng phản hồi có được tìm nạp từ vị trí bạn chấp nhận hay không.
Điều này tất nhiên có nghĩa là kết quả vẫn được tìm nạp, nhưng ít nhất bạn có thể nhận được thông tin cần thiết về đích chuyển hướng và ví dụ như phát hiện các điều kiện khi bạn muốn hủy phản hồi.



11

Không, bạn không có bất kỳ vị trí nào trong API được XMLHttpRequest tiết lộ cho phép bạn ghi đè hành vi mặc định của nó là tự động theo dõi 301 hoặc 302.

Nếu máy khách đang chạy IE trên windows thì bạn có thể sử dụng WinHTTP thay thế để đặt một tùy chọn để ngăn chặn hành vi đó nhưng đó là một giải pháp rất hạn chế.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.