Дайте им 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 Про 200 в заголовке из реплики на стыковерфлоу про веб-дизайнеров которые кроме статуса 200 ничего не знают. Я и 302 пробовал - по старым стандартам - эквипенисуально. Короче, как заредиректить клиента через аякс заголовками, или это невозможно? |
Ну то есть с сервера вот так же делается
header('Location: '.$url); Ну казалось бы какая разница - пошлю в скрипт ури и он сделает то же самое. |
Цитата:
|
Цитата:
|
Обычный редирект заредиректит и выдаст в скрипт весь сайт, это же очевидно. А мне надо чтобы не тот канал переключился который позади страницы (аяксом), а чтобы аякс _этот_ канал переключил. Я выдаю в страницу только хтмл сообщения об ошибках, в случае успеха пага перегружается классическим образом. Потом что там кроме формы еще всякие справки, скрипты, стили.
Короче, методом научного самотыка удалось вычислить что во всем виновата rawurlencode(), то есть не она, а парсер браузера, который не видя схемы за всеми эти процентами, тупо подставлял какой-то текущий путь, щетая что я ему подал относительный. Теперь все летает header('HTTP/1.1 307 '.$url); document.location.assign(lnk.statusText); Почему народ не юзает эти заголовки я не знаю, вот статейка за 9 год http://blog.motane.lu/2009/02/11/htt...ajax-requests/ Аффтар, в сущности, предлагает тот же член в другой руке - ввести ключ в дополнительный заголовок, в то время как в message заголовка можно писать что угодно. |
Нет, это можно, залить контент из форточки, однако смысл теряется. Когда форма открыта там еще шапка и попка кроме нее и связанной тряхомудии. Получится что 90 процентов контента надо перезаливать - ну и нафиг, перезагрузил и готово.
|
Цитата:
|
xhr при чем тут? Скрипт только данные получает, ему безразлично с какого именно скрипта и сколько там редиректов сделано чтобы добыть нужную ему информацию. Он сделал запрос к example.com/one_page, а получил с example.com/page_33.
Если вы заинтересованы отследить что откуда - берете все заголовки и проверяете, там все должно быть. Ну а если из скрипта сделать location - страница перезагрузится и скрипт окажется в новой инкарнации. Насколько я понимаю скрипт может слать запросы еще и еще. Не получил что надо - сам ищет по другому URI. Страница в это время просто стоит. Она же хтмл, загружена, ей уже все пофигу. Бывает я так искорежу коды php что там ничего уже заведомо не отрендерится - а по аяксу все шарашит. |
Теперь все красиво
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; } |
Цитата:
Цитата:
|
На стэковерфлоу писали, что раньше в спеке к XHR было прямо прописано про прозрачный редирект. В новой спеке о редиректе ни слова.
|
Через него, а причем тут редиректы? Сервер может редиректить до опупения - скрипу все равно, скрипт может редиректить до опупения - сервер сколько вытерпит. Кипиш идет за стеной загруженного хтмля, юзер ничего не видит. А вот если открыть панель с заголовками (у меня исторически аддон Live HTTP Headers, где эта панель я даже не знаю) то сразу ощутишь неустанную работу по исчерпанию безлимита.
|
Что за прозрачный редирект, я наверно не понял. Нарисовать юзеру точно такую страницу какая была, а переместить его на домен где стырить всего его денги? Обычно делается наоборот вроде.
|
Цитата:
Если я сделал send() на abc.php, то хочу получить ответ, каким бы он ни был. Хочу получить статус, даже если это 302 статус, заголовок Location хочу получить. И уже сам хочу решить - идти по новому Location или нет. Вот то, что браузер делает втихомолку - это и есть прозрачный редирект. |
Или лучше всего опцию:
xhr.followLocation = false; Че стоит добавить такую? |
Так я ж говорю - при чем тут хар? И без него в точности такая картина. Ну а как еще тогда работали бы все эти чудесатые htaccess? Вы набираете Манчестер, а браузер хреначит в Ливерпуль, потому что так надо, потому что типа 302 Found.
Вы забыли с чего все начиналось - с файлов. Это сейчас контент генерят на лету собирая из подножного корма. А раньше были файлы. Так вот сервер сервировал их согласно спецификации. Не как какой-нить Проводник в винде - нет файла - иди нах - сервер искал. Все что написано после ? называется SEARCH STRING. То есть чтоб вы не запросили на сервере - он ИЩЕТ. Ну и где нашел - туда направляет, типа 302 Found. Кроме этого кода еще несколько есть в том же смысле. Ведь когда-то была такая идея что URI не может умереть, не может потеряться как какой-нить дурацкий файл в ОС. Что URL всегда будет открываться независимо от того, где лежит _файл_, потому что URL это функция, а не свойство. Короче, нипонял чему тут удивляться. Так все делают. Тот факт что и при аяксе нормально все редиректится - ну так отслеживайте по заголовкам, есть там инфа, да. |
Что в php юзают вместо XHR? ПРавильно, curl. Так вот, почему там можно запретить следовать редиректу, а в XHR нельзя? Чем мы, JS прогеры хуже PHP-прогеров?
|
Цитата:
Как и все инженерные технологии curl был порожден из лучших гуманных побуждений, но немедленно был применен в худшей ипостаси. В ответ начали приминать меры... в общем через браузер пока что удается неплохо тянуть. Потому что нельзя допускать инженеров до собственности, они такого понапишут, что все растащат. МР3 например - это же была самая гуманная идея сжатия звука с целью повышения культурного уровня населения. Инженеры сидели и мечтали о светлом будущем, когда любой человек может скачать полное собрание сочинений Бетховена или Леди Гаги... за деньги. Ага... :) |
Цитата:
Вот когда push технологии найдут широкое применение - вот тогда у вас появится отличый шанс на самовыражение - этому отказать, этого забанить, этот канал загнуть, а этот пусть живет. |
Кстати, попадался сайт, конкретно заколебал до невожможности - им как-то удалось все к чертям запечатать. Нельзя вывести в лог, нельзя записать в БД, нельзя обратиться к функции, нельзя то, се - блеать... пришлось через алерты собирать индексы, вписывать их текстом в скрипт и уже тырить контент. Стырил. :)
|
Отменяю свое изобретение в целях профилактики наступления на грабли прочитавших.
Оказалось статусы с ентитей Location - а такой сущностью снабжаются все статусы по редиректу - браузер хавает молча и ни с кем не делится. Я подумал нафиг этот грязный хак вписывать урл прямо в коммент к статусу и сделал "нормально", ну то есть не сделал, а подумал что ветка if($this->json) не нужна, ибо поймаю 302 Found, ловлю же более современный аналог 307, и убрал ее и получил х нанэ, а не редирект из JS. Браузер увидев Location молча поканал куда сказано, загрузил весь сайт, шаблон аякса загрузил его в content... Второе. Возможность получать и реагировать на заголовки создает ложное впечатление. По логике вещей юзерские ошибки возвращаются со статусом 200 ОК, поскольку они идут с сервера в составе хтмля. Это вот если разработать свои - аяксовые, и желательно их узаконить. А пока - задробить. Не делайте так. Получите 200 и разбирайте json. |
Часовой пояс GMT +3, время: 12:27. |