За последние 24 часа нас посетили 22672 программиста и 1211 роботов. Сейчас ищут 778 программистов ...

Неверное перенаправление на странице

Тема в разделе "Прочие вопросы по PHP", создана пользователем onderbert, 24 мар 2019.

  1. onderbert

    onderbert Новичок

    С нами с:
    24 мар 2019
    Сообщения:
    18
    Симпатии:
    1
    Всем доброго времени суток! Необходимо выполнить импорт файлов в базу данных MySQL с возможностью ограничить количество обрабатываемых строк. Данную задачу решил при помощи редиректов. Но вот не задача, сервер падает с ошибкой: Неверное перенаправление на странице.

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

    Сервер:
    nginx + apache
    PHP Version: 7.1.22

    Файлы:
    https://drive.google.com/drive/folders/1z0mLYHI-iAIhkMQHzH_nRDdAEizM4VEw?usp=sharing
    • Обработчик формы загрузки файлов смотрите: upload.php
    • Функция обработчик процесса импорта: offset.php
    • Классы подготовки и обработки файлов импорта: insert.php
    • Отчет импорта данных: finish.php

    Функция редирект:
    PHP:
    1. /** Функция редирект */
    2.  
    3. function redirect($url, $status = 302) {
    4.     header('Location: ' . str_replace(array('&', "\n", "\r"), array('&', '', ''), $url), true, $status);
    5.     exit();
    6. }
     
    #1 onderbert, 24 мар 2019
    Последнее редактирование: 24 мар 2019
  2. Vanchot

    Vanchot Активный пользователь

    С нами с:
    23 мар 2019
    Сообщения:
    104
    Симпатии:
    19
    Адрес:
    Ахерон (LV-426)
    С куками, может, проблема?
     
  3. onderbert

    onderbert Новичок

    С нами с:
    24 мар 2019
    Сообщения:
    18
    Симпатии:
    1
    Да нет проблема в циклическом редиректе. Но он нужен для выполнения задачи. Пока ломаю голову как это исправить, возможно ajax поможет, но не уверен буду пробовать.
     
  4. Vanchot

    Vanchot Активный пользователь

    С нами с:
    23 мар 2019
    Сообщения:
    104
    Симпатии:
    19
    Адрес:
    Ахерон (LV-426)
    Просто спросил, т.к. Гугл сразу выдаёт инфу о проблемах с куками. Там про цикличный редирект и прочее...
     
  5. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    Далеко не факт, что нужен редирект, в веб программировании редко когда бывает одно единственное и правильное решение, скорее всего вы не нашли более подходящего чем ваше.
     
  6. onderbert

    onderbert Новичок

    С нами с:
    24 мар 2019
    Сообщения:
    18
    Симпатии:
    1
    Задачу решил при помощи ajax. Проблема была в том что клиент не получал ответа во время выполнения
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    Лучше поздно, как говорится...
    Ошибка "неверное перенаправление" сигналится браузером, если новый URL совпадает с предыдущим и так *цать раз. Он резонно подозревает нездоровое зацикливание.

    Не надо слишком усложнять задачу и костылить. Достаточно ввести в адрес переменную величину, (бес)полезный параметр типа: текущее время, последний использованный id или номер итерации.

    Update: используйте header refresh вместо header location
    https://php.ru/forum/threads/nevernoe-perenapravlenie-na-stranice.75813/#post-596095
     
    #7 artoodetoo, 26 мар 2019
    Последнее редактирование: 30 мар 2019
    Dmitry Lazarev нравится это.
  8. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Увы
    PHP:
    1. $i = isset($_GET['i']) ? ((int) $_GET['i']) : 0;
    2. header('Location: ?i=' . ($i + 1));
    отработает 20 раз и пошлёт (по крайней мере в Chrome)
     
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    Ну не знаю в чём магия такого невезения, но таким вот способом работают долгоиграющие скрипты. Может быть потому, что реальные скрипты тратят какие-то милисекунды на реальную работу прежде чем вернут ответ. Мне лень выяснять почему работает то, что работает.

    См. https://php.ru/forum/threads/nevernoe-perenapravlenie-na-stranice.75813/#post-596095

    --- Добавлено ---
    Когда-то на этом форуме я публиковал скрипт, аналог генерируемой иконки gravatar, только он содержал заголовок Refresh. Картинка бесконечно обновлялась, делалая новые запросы с параметром.
     
    #9 artoodetoo, 29 мар 2019
    Последнее редактирование: 30 мар 2019
  10. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Странно, у меня не работает.
    Добавил рандомную паузу 1...3 секунды, сделал перекидывание между двумя разными хостами, $i инкрементится, добавил &rand=рандомная хрень.
    Всё равно 20 редиректов - и ошибка.
    Похоже, что они добавили проверку на общее количество редиректов. И не важно откуда и куда, какие там параметры в запросе, какой хост - всё пофиг. Просто 20 редиректов подряд = ошибка.
     
  11. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    @sobachnik, нормально, что не работает. На много редиректов полагаться не стоит. Например, у нас в правилах написано – использовать не более трех редиректов. ТС выбрал норм. решение – AJAX.
     
  12. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    @miketomlin ну так-то да, согласен. Тут просто под конец зашёл разговор о том, что это в принципе должно работать, но я добавил, что у меня не работает :)
    А вообще, когда мне нужно, что бы скрипт обработал много-много чего-то, и лень делать со всякими аяксами - я обычно просто пишу
    PHP:
    и не парюсь
     
  13. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    Окей, признаю — был неправ, потому что давно не пробовал. Уточняю: надо использовать не 302-й редирект, а рефреш. Рефреш это либо <meta refresh>, либо http заголовок header('Refresh...')., в зависимости от вашего контекста. Работает в точности как javascript:window.location=... но без javascript.

    Рабочий пример neverends.php:
    PHP:
    1. <?php
    2.  
    3. $i = isset($_GET['i']) ? intval($_GET['i']) : 0;
    4. usleep(mt_rand(500000, 2000000));
    5.  
    6. header('Content-Type: text/html; charset=utf-8');
    7. header('Refresh:0; url=?i='.($i+1));
    8.  
    9. ?>
    10. Ineration No. <?= $i ?>
     

    Вложения:

    miketomlin нравится это.
  14. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    @artoodetoo, ну я сразу понял, что у тебя был успешный опыт именно с Refresh. Насколько знаю, это неофициальный (или устаревший?) заголовок, хотя широко поддерживаемый. JS часто используется, как дополнение к нему, а не как полная альтернатива.
    --- Добавлено ---
    @sobachnik, ну так можно и из командной строки запустить скрипт. Я подразумевал норм. обратную связь с клиентом, а не штатное «крутящееся колесико» браузера.