Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Дайте им 200 и они счастливы, как насчет 307? (https://javascript.ru/forum/misc/50877-dajjte-im-200-i-oni-schastlivy-kak-naschet-307-a.html)

kostyanet 15.10.2014 15:39

Дайте им 200 и они счастливы, как насчет 307?
 
Было как за комментариями, стало как вверху без комментариев

header('HTTP/1.1 307 '.rawurlencode($url));
//header('Content-type: application/json; charset='.PAGE_ENCODING);
//echo json_encode(array('Location'=>$url));


как было внизу - работало, но показалось бредом. Передаешь голимый текст чтобы в нем потом разбираться, в то время как есть нормальные заголовки и статус и текст которых приходят исправно. В отличии от, кстати, responseType, который тупо равен ""

Соответственно в js

if (status == 307) {
	location.assign(decodeURI(link.statusText));
	return true;
}


Так вот ФФ редиректит теперь во-первых GET'ом, во вторых х знает куда.

Вот ему приходит через форточку (домен заменил)

Код:

HTTP/1.1 307 http%3A%2F%2Fexample.com%2Fkontakty%2Fcomeback%2Fsent%3Fid%3D58
браза вот что вытворяет

Код:

http://example.com/kontakty/http%3A%2F%2Fexample.com%2Fkontakty%2Fcomeback%2Fsent%3Fid%3D58

GET /kontakty/http%3A%2F%2Fexample.com%2Fkontakty%2Fcomeback%2Fsent%3Fid%3D58 HTTP/1.1

То есть приклеивает полученный URI к части старого по непонятно какому принципу.

Про 200 в заголовке из реплики на стыковерфлоу про веб-дизайнеров которые кроме статуса 200 ничего не знают.

Я и 302 пробовал - по старым стандартам - эквипенисуально.

Короче, как заредиректить клиента через аякс заголовками, или это невозможно?

kostyanet 15.10.2014 15:42

Ну то есть с сервера вот так же делается

header('Location: '.$url);

Ну казалось бы какая разница - пошлю в скрипт ури и он сделает то же самое.

danik.js 15.10.2014 15:43

Цитата:

Сообщение от kostyanet
Короче, как заредиректить клиента через аякс заголовками, или это невозможно?

Обычный http-редирект чем не устраивает?

danik.js 15.10.2014 15:44

Цитата:

Сообщение от kostyanet
Ну казалось бы какая разница - пошлю в скрипт ури и он сделает то же самое.

Дык че, не работает чтоли? А пачиму?

kostyanet 15.10.2014 16:30

Обычный редирект заредиректит и выдаст в скрипт весь сайт, это же очевидно. А мне надо чтобы не тот канал переключился который позади страницы (аяксом), а чтобы аякс _этот_ канал переключил. Я выдаю в страницу только хтмл сообщения об ошибках, в случае успеха пага перегружается классическим образом. Потом что там кроме формы еще всякие справки, скрипты, стили.

Короче, методом научного самотыка удалось вычислить что во всем виновата rawurlencode(), то есть не она, а парсер браузера, который не видя схемы за всеми эти процентами, тупо подставлял какой-то текущий путь, щетая что я ему подал относительный.

Теперь все летает

header('HTTP/1.1 307 '.$url);


document.location.assign(lnk.statusText);


Почему народ не юзает эти заголовки я не знаю, вот статейка за 9 год http://blog.motane.lu/2009/02/11/htt...ajax-requests/

Аффтар, в сущности, предлагает тот же член в другой руке - ввести ключ в дополнительный заголовок, в то время как в message заголовка можно писать что угодно.

kostyanet 15.10.2014 16:38

Нет, это можно, залить контент из форточки, однако смысл теряется. Когда форма открыта там еще шапка и попка кроме нее и связанной тряхомудии. Получится что 90 процентов контента надо перезаливать - ну и нафиг, перезагрузил и готово.

danik.js 15.10.2014 17:00

Цитата:

Сообщение от kostyanet
Обычный редирект заредиректит и выдаст в скрипт весь сайт, это же очевидно

Почему это очевидно? Мне вот не очевидно. Я не знал что xhr делает прозрачный редирект. Я раньше замечал редиректы, но думал, что фича jQuery. Печально, очень печально. Ибо это и должно быть фичей какой-нибудь jQuery, а не встроено в браузер. Или это наоборот правильно?

kostyanet 15.10.2014 17:24

xhr при чем тут? Скрипт только данные получает, ему безразлично с какого именно скрипта и сколько там редиректов сделано чтобы добыть нужную ему информацию. Он сделал запрос к example.com/one_page, а получил с example.com/page_33.

Если вы заинтересованы отследить что откуда - берете все заголовки и проверяете, там все должно быть.

Ну а если из скрипта сделать location - страница перезагрузится и скрипт окажется в новой инкарнации.

Насколько я понимаю скрипт может слать запросы еще и еще. Не получил что надо - сам ищет по другому URI. Страница в это время просто стоит.

Она же хтмл, загружена, ей уже все пофигу. Бывает я так искорежу коды php что там ничего уже заведомо не отрендерится - а по аяксу все шарашит.

kostyanet 15.10.2014 17:30

Теперь все красиво

if($this->ajax)
		header('HTTP/1.1 307 '.$url);
	else
		header('Location: '.$url);
	exit;


Может кто не знает или не знал: не обязательно заводить ajax.php, или цеплять гетом в action ?ajax, есть же заголовки:

Между open и send вставляется

link.setRequestHeader("X-Requested-With", "XMLHttpRequest");


на сервере диагностируется

protected function get_ajax() {
        return (int) !empty($_SERVER['HTTP_X_REQUESTED_WITH'])
		&& strcasecmp($_SERVER['HTTP_X_REQUESTED_WITH'],'xmlhttprequest')==0;
}

danik.js 15.10.2014 17:33

Цитата:

Сообщение от kostyanet
xhr при чем тут?

Дык ты не через него делаешь запрос?

Цитата:

Сообщение от kostyanet
link.setRequestHeader("X-Requested-With", "XMLHttpRequest");

А это тогда причем?


Часовой пояс GMT +3, время: 23:04.