Trả lại chuyển hướng như phản hồi yêu cầu XHR


Câu trả lời:


216

Điều gì xảy ra nếu trình duyệt nhận được phản hồi chuyển hướng đến yêu cầu ajax?

Nếu máy chủ gửi chuyển hướng (còn gọi là phản hồi 302 cộng với tiêu đề Location:) thì chuyển hướng sẽ tự động theo sau bởi trình duyệt. Phản hồi cho yêu cầu thứ hai (giả sử nó cũng không phải là một chuyển hướng khác) là những gì được đưa ra cho chương trình của bạn.

Thực tế, bạn không có khả năng phát hiện xem phản hồi 302 có xảy ra hay không. Nếu chuyển hướng 302 dẫn đến 200, thì chương trình của bạn hoạt động giống hệt như yêu cầu ban đầu dẫn trực tiếp đến 200.

Đây là cả kinh nghiệm của tôi và hành vi được gọi ra trong thông số kỹ thuật .

Cập nhật năm 2016: Thời gian đã trôi qua và tin vui là API tìm nạp mới () được cung cấp để kiểm soát chi tiết hơn về cách xử lý các chuyển hướng , với hành vi mặc định tương tự như XHR. Điều đó nói rằng, nó chỉ hoạt động khi fetch () được thực hiện nguyên bản . Các phiên bản polyfill của fetch () đã được dựa trên XHR, tiếp tục có những hạn chế của XHR . May mắn thay, hỗ trợ trình duyệt riêng dường như được làm tròn độc đáo.


47
Thật thú vị, tôi đã đến đây vì tôi đang gặp phải tình huống chuyển hướng rõ ràng không được theo dõi ... điều này xảy ra khi chuyển hướng vi phạm chính sách xuất xứ tương tự.
Gus

4
@Gus có lẽ hợp lý
Dmitry

1
Trong trường hợp chuyển hướng đến một lỗi 401 (hoặc bất kỳ lỗi 4xx hoặc 5xx nào), tôi cho rằng chương trình của bạn sẽ hoạt động như thể yêu cầu dẫn trực tiếp đến một 401. Đó có phải là những gì bạn đang thấy không?
chào

2
API RESTful có thể gửi 201 và tiêu đề Vị trí sau khi yêu cầu POST; xem restapitutorial.com/lessons/httpmethods.html .

1
Cập nhật 2019: fetch không hoạt động như chúng ta mong đợi 3 năm trước):
lcjury

7

Các ajax-requestsẽ làm theo mà chuyển hướng afaik. Nội dung thực tế ( .responseText, .responseXML) sẽ là nội dung từ trang bạn được chuyển hướng đến.

Bạn có thể chặn chuyển hướng ( status-code, location-header) trên readyState2 hoặc 3, nhưng không chắc chắn về điều đó.


Không, tất cả những trạng thái mang chính xác như nhau. Ngay cả giá trị getAllResponseHeaders()là bằng nhau.
sebastianwagner
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.