А почему сервер возвращает 200, а не 301/302?
Решением в вашем случае будет отправка ответа от сервера с кодом 302 и кастомным заголовком (типа X-Redirect), и последующей его проверкой в js.
Так, например, сделано в Yii2:
if (Yii::$app->getRequest()->getIsAjax()) {
if (Yii::$app->getRequest()->getHeaders()->get('X-Ie-Redirect-Compatibility') !== null && $statusCode === 302) {
// Ajax 302 redirect in IE does not work. Change status code to 200. See https://github.com/yiisoft/yii2/issues/9670
$statusCode = 200;
}
if (Yii::$app->getRequest()->getIsPjax()) {
$this->getHeaders()->set('X-Pjax-Url', $url);
} else {
$this->getHeaders()->set('X-Redirect', $url);
}
} else {
$this->getHeaders()->set('Location', $url);
}
И проверка:
$(document).ajaxComplete(function (event, xhr) {
var url = xhr && xhr.getResponseHeader('X-Redirect');
if (url) {
window.location.assign(url);
}
});
Ну, и нужно помнить, что IE считает AJAX, который вернул не 200, ошибочным ответом. ¯\_(ツ)_/¯