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");

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

danik.js 15.10.2014 17:35

На стэковерфлоу писали, что раньше в спеке к XHR было прямо прописано про прозрачный редирект. В новой спеке о редиректе ни слова.

kostyanet 15.10.2014 17:39

Через него, а причем тут редиректы? Сервер может редиректить до опупения - скрипу все равно, скрипт может редиректить до опупения - сервер сколько вытерпит. Кипиш идет за стеной загруженного хтмля, юзер ничего не видит. А вот если открыть панель с заголовками (у меня исторически аддон Live HTTP Headers, где эта панель я даже не знаю) то сразу ощутишь неустанную работу по исчерпанию безлимита.

kostyanet 15.10.2014 17:40

Что за прозрачный редирект, я наверно не понял. Нарисовать юзеру точно такую страницу какая была, а переместить его на домен где стырить всего его денги? Обычно делается наоборот вроде.

danik.js 15.10.2014 18:04

Цитата:

Сообщение от kostyanet
Через него, а причем тут редиректы?

А почему я делаю xhr.send() на один URL, а браузер в тишь блядует по всяким Location, идет всюду куда его не пнет сервак?


Если я сделал send() на abc.php, то хочу получить ответ, каким бы он ни был. Хочу получить статус, даже если это 302 статус, заголовок Location хочу получить. И уже сам хочу решить - идти по новому Location или нет.

Вот то, что браузер делает втихомолку - это и есть прозрачный редирект.

danik.js 15.10.2014 18:05

Или лучше всего опцию:

xhr.followLocation = false;


Че стоит добавить такую?

kostyanet 16.10.2014 13:37

Так я ж говорю - при чем тут хар? И без него в точности такая картина. Ну а как еще тогда работали бы все эти чудесатые htaccess? Вы набираете Манчестер, а браузер хреначит в Ливерпуль, потому что так надо, потому что типа 302 Found.

Вы забыли с чего все начиналось - с файлов. Это сейчас контент генерят на лету собирая из подножного корма. А раньше были файлы. Так вот сервер сервировал их согласно спецификации. Не как какой-нить Проводник в винде - нет файла - иди нах - сервер искал. Все что написано после ? называется SEARCH STRING. То есть чтоб вы не запросили на сервере - он ИЩЕТ. Ну и где нашел - туда направляет, типа 302 Found. Кроме этого кода еще несколько есть в том же смысле.

Ведь когда-то была такая идея что URI не может умереть, не может потеряться как какой-нить дурацкий файл в ОС. Что URL всегда будет открываться независимо от того, где лежит _файл_, потому что URL это функция, а не свойство.

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

danik.js 16.10.2014 13:59

Что в php юзают вместо XHR? ПРавильно, curl. Так вот, почему там можно запретить следовать редиректу, а в XHR нельзя? Чем мы, JS прогеры хуже PHP-прогеров?

kostyanet 16.10.2014 20:56

Цитата:

Сообщение от danik.js
ПРавильно, curl

Я не юзаю, я честно пишу скрипты под GM и тырю в любых объемах что заказали. :)

Как и все инженерные технологии curl был порожден из лучших гуманных побуждений, но немедленно был применен в худшей ипостаси. В ответ начали приминать меры... в общем через браузер пока что удается неплохо тянуть.

Потому что нельзя допускать инженеров до собственности, они такого понапишут, что все растащат. МР3 например - это же была самая гуманная идея сжатия звука с целью повышения культурного уровня населения. Инженеры сидели и мечтали о светлом будущем, когда любой человек может скачать полное собрание сочинений Бетховена или Леди Гаги... за деньги. Ага... :)

kostyanet 16.10.2014 21:00

Цитата:

Сообщение от danik.js
а в XHR нельзя

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

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

kostyanet 16.10.2014 21:02

Кстати, попадался сайт, конкретно заколебал до невожможности - им как-то удалось все к чертям запечатать. Нельзя вывести в лог, нельзя записать в БД, нельзя обратиться к функции, нельзя то, се - блеать... пришлось через алерты собирать индексы, вписывать их текстом в скрипт и уже тырить контент. Стырил. :)

kostyanet 28.10.2014 03:27

Отменяю свое изобретение в целях профилактики наступления на грабли прочитавших.

Оказалось статусы с ентитей Location - а такой сущностью снабжаются все статусы по редиректу - браузер хавает молча и ни с кем не делится.

Я подумал нафиг этот грязный хак вписывать урл прямо в коммент к статусу и сделал "нормально", ну то есть не сделал, а подумал что ветка if($this->json) не нужна, ибо поймаю 302 Found, ловлю же более современный аналог 307, и убрал ее и получил х нанэ, а не редирект из JS.

Браузер увидев Location молча поканал куда сказано, загрузил весь сайт, шаблон аякса загрузил его в content...

Второе. Возможность получать и реагировать на заголовки создает ложное впечатление. По логике вещей юзерские ошибки возвращаются со статусом 200 ОК, поскольку они идут с сервера в составе хтмля.

Это вот если разработать свои - аяксовые, и желательно их узаконить. А пока - задробить. Не делайте так. Получите 200 и разбирайте json.


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