Запобігання перенаправлення Xmlhttprequest


112

Чи можна перешкодити браузеру слідувати переспрямуванням при надсиланні XMLHttpRequest-s (тобто повернути код статусу переадресації та обробити його самостійно)?

Відповіді:


102

Не відповідно до стандарту W3C для об'єкта XMLHttpRequest (наголос додано):

Якщо відповідь перенаправлення HTTP:

Якщо джерело URL-адреси, що передається заголовком Location, є однаковим з початком XMLHttpRequest і переспрямування не порушує нескінченних запобіжних циклів, прозоро дотримуйтесь переспрямування , дотримуючись правил однакового запиту події запиту.

Вони розглядали це щодо майбутнього випуску:

Ця специфікація не включає такі функції, які розглядаються для майбутньої версії цієї специфікації:

  • Властивість відключити наступні переадресації;

але остання специфікація вже не згадує про це.


5
Що смішно, коли прозоре переадресація передбачає перезапис деяких заголовків HTTP, які були встановлені в оригінальному запиті. Зокрема, якщо для заголовка "Прийняти" було встановлено певний тип вмісту, Firefox не може включити цей заголовок під час виконання переспрямування (що ускладнює розробку веб-служб на основі REST, які використовують цей заголовок ... бурчить).
ruquay

1
Ще кілька пошуків принесли мені цей досить старий звіт про помилку: bugzilla.mozilla.org/show_bug.cgi?id=401564
ruquay

2
Погодьтеся, абсолютно недолік дизайну.
Расив

35

Новий Fetch API підтримує різні режими обробки редиректу: follow, errorі manual, але я не можу знайти спосіб , щоб переглянути новий URL або код стану , коли Перенаправлення було скасовано. Ви можете просто зупинити перенаправлення, і тоді це виглядає як помилка (порожня відповідь). Якщо це все, що вам потрібно, ви добре піти. Крім того, слід мати в виду , що запити , зроблені з допомогою цього API не відміняв ще . Вони зараз є .

Що стосується XMLHttpRequest, ви можете HEADсервер і перевірити, чи змінилася URL-адреса:

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

Ви не отримаєте код статусу, але знайдете нову URL-адресу, не завантажуючи з неї всю сторінку.


Іноді використання OPTIONSможе бути кращим вибором, так чи інакше працює лише для не загальних цілей, і т. Д. Адміністратор налаштував перенаправити весь сайт / схему, наприклад, HTTP -> HTTPS
William Leung

12

Ви можете використовувати responseURLвластивість, щоб отримати місце переадресації або перевірити, чи отримана відповідь була в кінцевому підсумку з місця, яке ви приймаєте.
Звичайно, це означає, що результат все-таки отримується, але принаймні ви можете отримати необхідну інформацію про місце перенаправлення та, наприклад, виявити умови, коли ви хочете відкинути відповідь.



11

Ні, у вас немає жодного місця в API, оголеному XMLHttpRequest, що дозволяє автоматично переосмислити його поведінку за замовчуванням після виконання 301 або 302.

Якщо клієнт працює під керуванням IE у Windows, ви можете використовувати WinHTTP замість цього, щоб встановити параметр для запобігання такої поведінки, але це дуже обмежує рішення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.