Я пришел к аналогичной проблеме и решил ее, проверив тип запроса. В моем случае я использую JSON, но он работает и для других запросов POST:
var ajax = req.xhr;
if(ajax) {
res.status(401).json({'msg':'redirect','location':'/login'});
}
else {
req.method = 'get';
res.status(401).redirect('/login');
//Or if you prefer plain text
//res.status(333).send("Redirect");
}
Это обрабатывает как Ajax POST, так и AJAX и стандартные запросы GET.
На клиенте в Ajax respose обратный вызов:
$.ajax({
type: 'POST',
data: Msg,
url: '/some/post',
dataType: 'JSON'
}).success(function(data, textStatus, req ) {
if(data.msg==="redirect") window.location = data.location;
else {...}
}).error(function(data, textStatus, req) {
if(req=="Unauthorized") {
alert("Unauthorized!");
window.location = "/login";
} else if (data.responseJSON.msg==="redirect") window.location = data.responseJSON.location;
else {
//...
}
});
Здесь вы можете обрабатывать больше статусов, кроме 302, за которым автоматически следует JQuery, и вы получаете ответ 200 со страницы, на которую вы хотите перенаправить. Поэтому я избегаю отправки 302, отправки 401 в моем случае или любого другого состояния, например 333, которое будет обработано как ошибка.