У меня есть веб-страница с формой. Когда пользователь отправляет форму, я хочу, чтобы сервер перенаправил браузер на страницу, отличную от действия формы. Сейчас я делаю это с помощью PHP-функции header для отправки кода состояния 302. Работает нормально.
Я пытаюсь заставить страницу на сервере перенаправлять браузер одинаково, независимо от того, была ли она отправлена нормально (без Javascript) или через Ajax. Я попытался сделать это, установив местоположение окна на любой URL в заголовке Location. Я использую JQuery, и делаю вызов, как это:
$.ajax({
url: this.action,
type: "POST",
data: getFormData(this),
complete: function(request) {
window.location.assign(request.getResponseHeader("Location"));
}
});
Однако это не сработало. Подумав об этом, я понял, что это не очень удивительно. В Ajax-запросе браузер должен прозрачно обрабатывать ответы перенаправления, такие как коды 302, перед изменением readyState. Когда выполняется полная функция, она ищет заголовок Location в конечном пункте назначения и не находит его.
В качестве эксперимента я попытался отправить код состояния 200 с заголовком Location. Я попробовал запрос Ajax, и он работал нормально. Однако, когда я подал заявку без Ajax, это не сработало. Браузер перешел на страницу действия формы и остался там, как будто игнорировал заголовок Location.
Можно ли как-то перенаправить одну и ту же страницу в обоих случаях, при этом серверу не нужно знать или заботиться о том, является ли запрос Ajax-запросом?
В случае, если это имеет значение, я пробовал форму в различных браузерах (IE8, IE7, IE6, Firefox 3.5, Chrome) с одинаковыми результатами каждый раз. Кроме того, я выполняю запрос на публикацию, чтобы избежать столкновения с 2083-символьным ограничением длины URL в IE.